Ai 01
개요
이전 AI 인트로에서 간략하게 머신러닝에 대해 다뤘다. 오늘은 코드를 작성해보며 어떤 툴들이 존재하고 어떻게 구성되는지 알아보자.
판다스
머신러닝에서 데이터셋을 다룰 때 판다스 라이브러리를 주로 사용한다. 판다스는 1차원 배열 형태의 시리즈 자료구조와 2차원 배열 형태의 데이터프레임 자료구조를 지원하는데 데이터프레임은 마치 엑셀과 같은 격자 구조를 지원한다.
시리즈는 데이터 값을 1차원 벡터로 원소의 순서를 나타내는 인덱스로 원소들을 식별한다. 데이터 프레임은 여러 개의 시리즈를 이어붙인 형태로 2차원 구조를 갖는다.
import pandas as pd
print(pd.__version__)
위의 코드를 실행시켜보자. 판다스는 pd로 줄여 사용한다. 이유는 없다. 다른 이름으로 줄일 수도 있지만 pd로 사용하는 것이 관례다.
dataset = [1, 2, 3, 4, 5]
dataset1 = pd.Series(dataset)
print(type(dataset1))
# <class 'pandas.core.series.Series'>
dataset1을 출력해보면 각 데이터 왼쪽에 숫자형 인덱스가 존재한다. 만약 특정 객체의 원소를 추출할 때에는 loc 인덱서를 사용한다. 원소의 안에 인덱스를 적는다.
예를 들어 첫번째 요소를 출력하고싶다면 dataset1.loc[0]이런식으로 적으면 된다. 아마 짐작했다시피 loc은 location의 약자다.
범위로 추출하는 것도 가능한데 :기호를 사용한다. dataset[:].
주의해야할 점은 파이썬 리스트의 슬라이싱은 오른쪽 인덱스에 해당하는 데이터는 해당되지 않지만 판다스의 경우 오른쪽 인덱스도 포함된다는 것이다.
예를 들어 위의 데이터에서 마지막 인덱스를 4로 지정한다면 dataset1.loc[:4]전체 요소가 다 출력된다.
그리고 위에서 설명한대로 시리즈를 여러 개 이어붙이면 2차원의 데이터프레임이 된다.
dict_data = {'c0':dataset1, 'c1':dataset2}
df1 = pd.DataFrame(dict_data)
df1
데이터프레임의 열 이름은 columns 속성으로 추출할 수 있다.
df1.columns
#Index(['c0', 'c1'], dtype='object')
열 이름을 재지정하는 것도 가능하다.
df1.columns = ['dataset1', 'dataset2]
df1.columns
# Index(['dataset1', 'dataset2'], dtype='object')
행 인덱스는 0부터 오름차순으로 정렬되고 index속성을 통해 추출할 수 있다. df1.index.
행 인덱스도 열과 마찬가지로 같은 방법으로 이름 재지정이 가능하다.
쉽게 정리하면 슬라이싱의 경우 [:, :] 앞의 :은 몇 개의 행을 추출할 것인지, 뒤의 :는 몇 개의 열을 추출할 것인지에 해당한다.
['r1':'r2', :] r1행 부터 r2행까지 모든 열을 추출한다.
[r1, 'string','number'] r1하나의 행을 추출하는데 뽑을 열은 string부터 number까지다.
이제 간단한 머신러닝 문제를 풀어보자
선형회귀
선형회귀란 데이터들을 가장 잘 설명하는 직선을 고르고 주어지지 않은 데이터를 예측하는 것이다.
이전에 다루었던 경제성장률이 그러하다. 수학으로 따지면 y = ax+c의 형태다.
아래는 기본적인 선형회귀 코드다.
import matplotlib.pyplot as plt
X = [1, 2, 3, 4, 5]
y = [1, 2, 3, 4, 5]
plt.plot(X, y)
plt.show()
import pandas as pd
df = pd.DataFrame({'X':X, 'y':y})
df.shape
df.head()
이제 간단한 x = y방정식의 데이터를 넣어 선형회귀해보자.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
x_train = df.loc[:, ['X']]
y_train = df.loc[:, ['y']]
model = LinearRegression()
model.fit(x_train, y_train)
X_test = pd.DataFrame({'X': np.arange(11, 16, 1)})
y_pred = model.predict(X_test)
y_pred