한 세트의 사례들을(examples) 기반으로 예측을 수행
비지도 학습을 수행할 때 기계는 미분류 데이터만을 제공 받음
학습하는 시스템을 에이전트라고 하고, 환경을 관찰해서 에이전트가 스스로 행동하게 함. 모델은 그 결과로 특정 보상을 받아 이 보상을 최대화하도록 학습
-> 라벨(정답)의 존재 유무에 따라 머신러닝을 지도학습과 비지도학습으로 나눈다
-> 구현하고자 하는 Application에 따라 합쳐서 사용될 수도 있다.
알고리즘은 파이썬 클래스로 구현되어 있고, 데이터셋은 NumPy의 ndarray, Pandas의 DataFrame, SciPy의 Sparse Matrix를 이용해 나타낼 수 있다. 훈련과 예측 등 머신러닝 모델을 다룰 때는 CoreAPI라고 불리는 fit(), transfomer(), predict()과 같은 함수들을 이용한다.
Classification, Regression, Clustering, Dimensionality Reduction
데이터 수량
라벨의 유무(정답의 유무)
데이터의 종류 (수치형 데이터(quantity), 범주형 데이터(category) 등)
특성 행렬(Feature Matrix)
타겟 벡터(Target Vector)
-> 특성 행렬 X의 n_samples와 타겟 벡터 y의 n_samples는 동일해야함.
머신러닝의 회귀 모델을 이용해 데이터를 예측하는 모델
#데이터 모양 확인
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 #입력데이터 x모양 확인
>(100.0) #1차원 벡터
y.shape #정답데이터 y모양 확인
>(100.) #1차원 벡터
#모델 객체 생성 및 훈련
from sklearn.linear_model import LinearRegression #sklearn.linear_model 안에 LinearRegression 모델 객체 생성
model = LinearRegression()
model
X = x.reshape(100,1) #reshape()사용해 x를 행렬로 바꿔야함. 변수 X에 특성행렬 넣기
model.fit(X,y) #fit()메서드로 훈련. fit()메서드에 인자로 특성행렬화 타겟벡터를 넣어줌(행렬형태의 입력데이터, 1차원 벡터 형태의 정답(라벨))
#새로운 데이터 넣어 예측하기
x_new = np.linspace(-1, 11, 100) #새로운 데이터 np.linspace()로 생성
X_new = x_new.reshape(100,1)
y_new = model.predict(X_new) #예측 predict() 인자 행렬x넣기
#모델 성능 평가
from sklearn.metrics import mean_squared_error
error = np.sqrt(mean_squared_error(y,y_new))
print(error)
#와인분류 데이터 import
from sklearn.datasets import load_wine
data = load_wine()
type(data)
data.keys()
>dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names']) #data key값들
data.data #특성행렬
data.data.shape #모양 확인
> (178, 13) #특성이 13개, 데이터가 178개인 특성행렬
data.data.ndim #차원 확인
>2 #2차원
data.target #타겟벡터
data.target.shape
>(178.0) #특성행렬(data) 데이터수와 일치함
data.feature_names #data에서 알아낸 13개의 특성 이름 확인
len(data.feature_names) #len()내장함수 사용해서 feature개수세기
data.target_names #분류하고자 하는 대상
>array(['class_0', 'class_1', 'class_2'], dtype='<U7') #데이터를 각각 class_0, class_1, class_2로 분류한다.
print(data.DESCR) #describe
import pandas as pd
pd.DataFrame(data.data, columns=data.feature_names)
X = data.data #특성행렬data 변수X에 저장
y = data.target #타겟벡터target y에 저장
from sklearn.ensemble import RandomForestClassifier #(1)랜덤포레스트분류모델 import
model = RandomForestClassifier()
model.fit(X, y) #(2)훈련
y_pred = model.predict(X) #(3)예측
#($)성능평가
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))
model_selection의 train_test_split() 함수 사용해 훈련데이터 테스트데이터 분리
from sklearn.model_selection import train_test_split
result = train_test_split(X, #인자로 특성행렬X
y, #인자로 타겟벡터y
test_size=0.2, #테스트데이터비율20%인 0.2
random_state=42) #임의 랜덤번호
print(type(result))
print(len(result))
><class 'list'>
4 #4개의 원소로 이루어진 list반환
#4개의 list
result[0].shape #훈련 데이터용 특성 행렬
result[1].shape #테스트 데이터용 특성 행렬
result[2].shape #훈련 데이터용 타겟 벡터
result[3].shape #테스트 데이터용 타겟 벡터
#위 함수를 다시 unpacking
X_train, X_test, y_train, y_test = train_test_split(X,
y,
test_size=0.2,
random_state=42)
# 데이터셋 로드하기
# data = load_wine()
# 훈련용 데이터셋 나누기
X_train, X_test, y_train, y_test = train_test_split(data.data,
data.target,
test_size=0.2)
# 훈련하기
model = RandomForestClassifier()
model.fit(X_train, y_train)
# 예측하기
y_pred = model.predict(X_test)
# 정답률 출력하기
print("정답률=", accuracy_score(y_test, y_pred))