이번 포스팅부터는 scikit - learn에 대해서 공부를 시작하겠습니다. scikit-learn은 다양한 머신러닝에 관련된 패키지가 모여있는 라이브러리이며, 연습용 데이터,데이터 전처리 함수, 후처리, 평가방법 등 다양한 기능들이 모여있는 패키지 입니다.
이번포스팅에 scikit-learn에 대한 다양한 함수들을 간략하게 살펴보고 다음 포스팅 부터는 예제 데이터를 통해서 실제로 모델링을 어떻게 하는지를 살펴보겠습니다.
!pip install scikit-learn
Requirement already satisfied: scikit-learn in c:\programdata\anaconda3\lib\site-packages (0.23.2) Requirement already satisfied: joblib>=0.11 in c:\programdata\anaconda3\lib\site-packages (from scikit-learn) (0.17.0) Requirement already satisfied: threadpoolctl>=2.0.0 in c:\programdata\anaconda3\lib\site-packages (from scikit-learn) (2.1.0) Requirement already satisfied: numpy>=1.13.3 in c:\programdata\anaconda3\lib\site-packages (from scikit-learn) (1.19.2) Requirement already satisfied: scipy>=0.19.1 in c:\programdata\anaconda3\lib\site-packages (from scikit-learn) (1.5.2)
import sklearn
import numpy as np # 간단한 예시들을 만들기 위해 import 합니다.
일반적으로 dataset이라고 하면 excel같이 생겼다 라고 받아들이시면 됩니다. (물론 그렇지 않은것도 많지만 )
해당 예시를 만들기 위해 np.random.normal이란 함수를 사용했고 위의 함수는 평균=0/표준편차=1 을 따르는 정규분포 데이터셋을 생성해냅니다. 생성된 데이터셋의 모양은 (4000,10) 을 사용하겠습니다. 간단히 featers(열, columns)가 10개이고 데이터의 갯수가 4000개라고 이해하시면 되겠습니다.
input_datasets = np.random.normal(0,1,size=(4000,10))
target_datasets = np.random.normal(10,3,size=(4000,))
input_datasets.shape,target_datasets.shape
((4000, 10), (4000,))
해당 함수는 train_set 과 test_set을 나눠주는 함수입니다.
여기서 train_set,test_set이 뭔지 모르시는 분들을 위해 간략하게 설명하면 모델을 훈련할때는 훈련용 데이터셋과 테스트용 데이터셋을 나눠야합니다. 훈련한 데이터셋을 통해서 테스트를 하게되면 해당 모델은 이미 그 데이터셋을 충분히 봣기(?) 때문에 좋은 결과가 나올수밖에 없습니다. 이러한 모델이 현장에 적용되게 된다면 실제 나온 평가지표보다 성능이 떨어지는 경우가 많기 때문에 모델을 정확하게 평가하기 위해선 훈련용 데이터와 테스트용 데이터를 나눠놔야 합니다.
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(input_datasets,target_datasets,test_size=0.2)
print(x_train.shape,x_test.shape,y_train.shape,y_test.shape)
(3200, 10) (800, 10) (3200,) (800,)
# x_train,x_test,y_train,y_test = train_test_split(input_dataset,target_datasets,train_size=0.8)
# print(x_train.shape,x_test.shape,y_train.shape,y_test.shape)
x_train,x_test,y_train,y_test = train_test_split(input_datasets,target_datasets,test_size=0.2,shuffle=False)
print(x_train.shape,x_test.shape,y_train.shape,y_test.shape)
(3200, 10) (800, 10) (3200,) (800,)
x_train,x_val,y_train,y_val = train_test_split(x_train,y_train,train_size=0.8)
print(x_train.shape,x_test.shape,x_val.shape)
print(y_train.shape,y_test.shape,y_val.shape)
(2560, 10) (800, 10) (640, 10) (2560,) (800,) (640,)
train_test_split에는 train_size,test_size,shuffle이라는 옵션이 있습니다. train_size / test_size 둘중에 하나만 지정해주시면 되고, shuffle 은 default로 True로 설정되어 있고 데이터셋을 섞습니다. False를 지정해주면 위에서부터 train_set으로 하면서 데이터셋을 섞지 않습니다.
일반적으로는 validation_set도 설정을 해주기때문에 train_set에서 한번더 train_test_split함수를 사용해줍니다. (validation은 훈련중에 모델이 참고하는 데이터로 생각하시면 됩니다.) (적절한 예시일지는 모르겠지만 train을 평소에 학습하는 공부라고 생각하시면, validation_dataset은 모의고사, test_dataset은 수능이라고 생각하시면 됩니다.)
일반적으로 데이터가 주어지면 각자 범위가 다 제각각일 겁니다.이런것을 값의 스케일이 다르다고 하는데 이렇게된 데이터셋으로 훈련을 진행하게 되면 스케일이 큰 핏쳐에 모델이 더 민감해지며 반대로 스케일이 작은 핏쳐의 경우네 모델이 둔해집니다. 그렇기 때문에 훈련이 잘된 모델이라고 할수 없습니다. 그래서 보통 훈련전에 데이터셋의 핏쳐들을 scaling 해주는데 이런 기능이 간단하게 구현되어 있는 것들을 sklearn에서 제공합니다. 위의 예시에는 가장 많이 쓰여지는 MinMaxScaler나 StandardScaler를 사용하겠지만 더 많은 scaler들이 존재하고 필요에 따라 사용하시면 됩니다. ex)standard,minmax,robust,maxabs,QuantileTransformer,PolynomialFeatures,PowerTransformer
from sklearn.preprocessing import MinMaxScaler,StandardScaler
scaler는 기본적으로 fit, transform이라는 함수가 있는데 fit 함수는 주어진 데이터셋에 대하여 최대,최소,평균,분산 등의 scaling에 필요한 정보를 파악하는 용도의 함수이며 transform함수는 실제로 그 파악한 정보를 통해 데이터셋의 값을 변환시키는 함수입니다.
일반적으로 train_set에 fit을 하고 trainset,testset,validationset에는 trainset에 fit한 정보를 토대로 transform을 진행합니다.
minmax_scaler = MinMaxScaler()
minmax_scaler.fit(x_train)
x_train = minmax_scaler.transform(x_train)
x_test = minmax_scaler.transform(x_test)
x_val = minmax_scaler.transform(x_val)
우리가 모델을 훈련시키고 나면 이 모델의 성능이 얼마나 되는지 정량적인 지표로 확인을 해야할 때가 있습니다. 그럴 경우에 사용되는 함수를 sklearn에서는 제공하는데 대표적으로 accuracy score 과 r2 score, mean_squared_error가 있습니다.
r2_score : 총제곱합은 관측값과 평균의 차이에서 기반하고 회귀제곱합은 회귀예측값과 평균의 차이에서 기반하기 때문에 일반적으로 '실제 값의 분산 대비 예측값의 분산 비율' 로 정의합니다. 요약하자면 R2 Score는 회귀 모델이 얼마나 '설명력' 이 있느냐를 의미합니다.
mean_squared_error : 평균 제곱 오차
accuracy score : 맞은 갯수/전체 갯수
from sklearn.metrics import accuracy_score,r2_score,mean_squared_error
# 간단한 사용을 위해 예제 데이터를 만들겠습니다.
y_prediction = np.array([1,2,3,4,5,6,7,8,9,10])
y_true = np.array([10,20,30,40,50,60,70,80,90,100])
print("R2 Score",r2_score(y_true,y_prediction))
print("Mean Squared Error",mean_squared_error(y_true,y_prediction))
R2 Score -2.78 Mean Squared Error 3118.5
y_prediction = np.array([[0,0,1],[0,0,1],[0,1,0],[1,0,0]])
y_true = np.array([[0,0,1],[0,1,0],[0,1,0],[1,0,0]])
print("Accuracy Score", accuracy_score(y_prediction,y_true))
Accuracy Score 0.75
이번 포스팅에서는 sklearn에서 자주사용하는 함수에 대해 알아보았는데 사실 이것보다 더 많은 기능을 제공합니다. 하이퍼 파라미터 튜닝을 도와주는 더 좋은 함수들이 있지만 그것은 나중에 model, 예시데이터를 이용해 본 후에 설명을 드리겠습니다.
sklearn_iris (0) | 2021.07.21 |
---|---|
sklearn_wine (0) | 2021.07.15 |
사이킷런 (scikit-learn,sklearn, diabetes) (0) | 2021.07.12 |
사이킷런 sklearn - boston house price (1) | 2021.07.06 |
댓글 영역