머신러닝 알고리즘 종류는 크게 3가지로 나눌 수 있습니다.
위 3가지 카테고리는 상황이나 구현하고자 하는 Application에 따라 합쳐서 사용될 수도 있습니다. 경우에 따라 지도학습으로 학습을 진행하다 차원과 특징(Feature)의 수가 너무 많아지면 비지도 학습으로 전환하기도 합니다.
어떤 문헌에서는 지도학습과 비지도학습의 중간 개념으로 준(반)지도학습(Semi-Supervised Learning) 또는 약지도학습(Weakly Supervised Learning)을 제시하기도 합니다.
알파고의 경우 지도학습을 통해 바둑 기보를 학습하고 강화학습을 거쳐 최적화되었습니다.
지도 학습에 속하는 대표적인 알고리즘
분류(Classification) : 예측해야할 데이터가 범주형(categorical) 변수일때 분류 라고 함
회귀(Regression) : 예측해야할 데이터가 연속적인 값 일때 회귀 라고 함
예측(Forecasting) : 과거 및 현재 데이터를 기반으로 미래를 예측하는 과정 예를 들어 올해와 전년도 매출을 기반으로 내년도 매출을 추산하는 것.
비지도 학습에 속하는 대표적인 알고리즘
클러스터링 : 특정 기준에 따라 유사한 데이터끼리 그룹화함
차원축소 : 고려해야할 변수를 줄이는 작업, 변수와 대상간 진정한 관계를 도출하기 용이
그밖의 알고리즘
선형회귀, 로지스틱 회귀, 트리, 앙상블트리 (랜덤포레스트, 그래디언트 부스팅), 신경망 & 딥러닝을 사용하는 알고리즘, K평균, K모드, 가우시안혼합모델 클러스터링, DBSCAN, 계층적 군집화, PCA, SVD, LDA
강화학습에서 학습하는 시스템을 에이전트라고 하고, 환경을 관찰해서 에이전트가 스스로 행동하게 합니다. 모델은 그 결과로 특정 보상을 받아 이 보상을 최대화하도록 학습합니다.
아래는 강화학습에서 기본적으로 쓰이는 용어들입니다.
다음은 강화학습 알고리즘의 대표적인 종류입니다.
강화학습 공부에 유용한 개발자 커뮤니티입니다.
Scikit-Learn에서 알고리즘 분류한 방법
사이킷런에서 알고리즘의 Task는 4가지 입니다.
1) Classification, 2) Regression, 3) Clustering, 4) Dimensionality Reduction
사이킷런에서는 알고리즘을 크게 3가지 기준으로 나누었습니다.
1) 데이터 수량
2) 라벨의 유무
3) 데이터의 종류(수치형 데이터(qunatity), 범주형 데이터(category) 등)
사이킷런에서 소개하는 알고리즘은 총 7개이며 다음과 같습니다.
SGD Classifier, KNeighborsClassifier, LinearSVC, NaiveBayes, SVC, Kernel approximation, EnsembleClassifiers
사이킷런에서 소개하는 Regression용 알고리즘은 7개이며 다음과 같습니다.
SGD Regressor, Lasso, ElasticNet, RidgeRegression, SVR(kernel='linear'), SVR(kernel='rbf'), EnsembelRegressor
Scikit-Learn에서 Ensemble, SGD 기법은 Classification, Regression Task 카테고리에 사용되었습니다.
사이킷런은 파이썬 기반 머신러닝 라이브러리입니다. 따라서 사이킷런은 다음과 같은 파이썬과 파이썬 라이브러리에 의존성을 갖습니다. Scikit-Learn 0.20까지는 Python 2.7과 Python 3.4에 동작하였습니다. 현재 최신 버전인 0.24를 사용하기 위해선 다음과 같은 사양이 요구됩니다.
# 버전 확인
import sklearn
print(sklearn.__version__)
[설치 가이드] Installing scikit-learn
사이킷런 공식 홈페이지
사이킷런 소개 영상
사이킷런의 사용법 설명 영상
transformer() : Scikit-Learn에서 ETL(Extract Transform Load) 기능을 수행하는 함수
Estimator : Scikit-Learn에서 모델(Model)로 표현되는 클래스
fit(), predict() : Estimator 클래스의 메소드
Pipeline 또는 meta-estimator : Estimator와 transformer() 2가지 기능을 수행하는 scikit-learn의 API
일반적으로 머신러닝에서 데이터 가공(ETL)을 거쳐 모델을 훈련하고 예측하는 과정을 거치는데 ETL부분은 ScikitLearn의 transformer()를 제공하고, 모델의 훈련과 예측은 Estimator 객체를 통해 수행되며, Estimator에는 각각 fit()(훈련), predict()(예측)을 행하는 메소드가 있습니다. 모델의 훈련과 예측이 끝나면 이 2가지는 작업을 Pipeline()으로 묶어 검증을 수행합니다.
사이킷런의 알고리즘은 파이썬 클래스로 구현되어 있고, 데이터셋은 NumPy의 ndarray, Pandas의 DataFrame, SciPy의 Sparse Matrix를 이용해 나타낼 수 있습니다. 훈련과 예측 등 머신러닝 모델을 다룰 때는 CoreAPI라고 불리는 fit(), transformer(), predict()과 같은 함수를 이용합니다.
주로 사용하는 API 모음
사이킷런에서 데이터 표현 방식 1) 특성행렬(Feature Matrix), 2) 타겟벡터(Target Vector)
특성 행렬(Feature Matrix)
n_samples: 행의 개수(표본의 개수)n_features: 열의 개수(특성의 개수)X: 통상 특성 행렬은 변수명 X로 표기합니다.타겟 벡터 (Target Vector)
n_samples: 벡터의 길이(라벨의 개수)y: 통상 타겟 벡터는 변수명 y로 표기합니다.import numpy as np
import matplotlib.pyplot as plt
r = np.random.RandomState(10)
x = 10 * r.rand(100)
y = 2 * x - 3 * r.rand(100)
plt.scatter(x,y)
x.shape
y.shape
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model
# 행렬 차원 맞춰주기
X = x.reshape(100,1)
model.fit(X,y)
# 새로운 데이터 넣어 예측
x_new = np.linspace(-1, 11, 100)
X_new = x_new.reshape(100, 1)
y_new = model.predict(X_new)
Tip!
reshape() 함수에서 나머지 숫자를 -1로 넣으면 자동으로 남은 숫자를 계산해줍니다.
X_ = x_new.reshape(-1,1) 이것도 가능
ghlrnl ahepfdml ruddn RMSE(Root Mean Square Error)를 사용해 성능을 평가합니다.
from sklearn.metrics import mean_squared_error
error = np.sqrt(mean_squared_error(y, y_new))
print(error)
plt.scatter(x, y, label='input data')
plt.plot(X_new, y_new, color='red', label='regression line')
사이킷런은 데이터셋을 모듈로 제공하고 있으며 데이터에 대한 내용은 아래 공식 문서를 참고하세요.
sklearn.datasets 모듈은 크게 dataset loaders와 dataset fetchers로 나뉘며, 각각 Toy dataset과 Real World dataset을 제공하고 있습니다. 여기서는 Toy dataset을 다뤄볼 예정입니다.
datasets.load_boston(): 회귀 문제, 미국 보스턴 집값 예측datasets.load_breast_cancer(): 분류 문제, 유방암 판별datasets.load_digits(): 분류 문제, 0 ~ 9 숫자 분류datasets.load_iris(): 분류 문제, iris 품종 분류datasets.load_wine(): 분류 문제, 와인 분류datasets.load_wine() 뜯어보기
from sklearn.datasets import load_wine
data = load_wine()
type(data)
>>> sklearn.utils.Bunch
sklearn.utils.Bunch 데이터 타입에 대한 설명
Bunch는 파이썬의 딕셔너리와 유사한 형태의 타입입니다.
print(data)
data.keys()
# data
data.data # data 확인
data.data.shape # shape 확인
data.data.ndim # 차원 확인
# target
data.target # 타겟 벡터
data.target.shape
# feature_names
data.feature_names
len(data.feature_names)
# target_names
print(data.DESCR)
DESCR를 통해 데이터를 class_0, class_1, class_2로 분류하는 것을 알 수 있습니다. (0번 와인, 1번 와인, 2번 와인)
사이킷런 공식 문서에서도 설명이 나와있습니다.
import pandas as pd
pd.DataFrame(data.data, columns=data.feature_names)
X = data.data
y = data.target
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X, y)
y_pred = model.predict(X)
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
#타겟 벡터 즉 라벨인 변수명 y와 예측값 y_pred을 각각 인자로 넣습니다.
print(classification_report(y, y_pred))
#정확도를 출력합니다.
print("accuracy = ", accuracy_score(y, y_pred))
Estimator 객체
데이터셋을 기반으로 머신러닝 모델의 파라미터를 추정하는 객체를 Estimator라고 합니다. 사이킷런의 모든 머신러닝 모델은 Estimator라는 파이썬 클래스로 구현되어 있습니다. 추정을 하는 과정 즉, 훈련은 Estimator의 fit()메소드를 통해 이루어지고, 예측은 predict()메소드를 통해 이루어집니다.
앞에서 실습에 사용한 Estimator 객체는 LinearRegression()과 RandomForestClassifier()입니다.
보통 훈련 데이터와 테스트 데이터의 비율은 8:2로 설정합니다.
from sklearn.datasets import load_wine
data = load_wine()
print(data.data.shape) #result: (178, 13)
print(data.target.shape) # result: (178, )
X_train = data.data[:142] # 178 x 0.8 = 142.4
X_test = data.data[142:]
print(X_train.shape, X_test.shape)
y_train = data.target[:142]
y_test = data.target[142:]
print(y_train.shape, y_test.shape)
# 훈련 및 예측
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
train_test_split() 사용해서 분리하기사이킷런에서는 이 기능을 API로 제공합니다.
model_selection의 train_test_split() 함수를 사용합니다.
from sklearn.model_selection import train_test_split
result = train_test_split(X, y, test_size=0.2, random_state=42)
print(type(result))
print(len(result))
result[0].shape
result[1].shape
result[2].shape
# 이렇게도 가능
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
아래는 와인 분류 문제의 데이터를 학습하는 코드입니다.
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# 데이터셋 로드하기
data = load_wine()
# 훈련용 데이터셋 나누기
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=11)
# 훈련하기
model = RandomForestClassifier()
model.fit(X_train, y_train)
# 예측하기
y_pred = model.predict(X_test)
# 정답률 출력하기
print("정답률=", accuracy_score(y_test, y_pred))
평가와 관련된 항목들은 metrics 모듈에 들어가 있습니다.
여기서 언급하진 않았지만 sklearn.preprocessing 모듈 역시 중요한 API 중 하나입니다.