Scikit Learn-모델링 프로세스
이 장에서는 Sklearn과 관련된 모델링 프로세스를 다룹니다. 이에 대해 자세히 이해하고 데이터 세트로드부터 시작하겠습니다.
데이터 세트로드
데이터 모음을 데이터 세트라고합니다. 그것은 다음 두 가지 구성 요소를 가지고 있습니다-
Features− 데이터의 변수를 특성이라고합니다. 예측 자, 입력 또는 속성이라고도합니다.
Feature matrix − 하나 이상의 기능이있는 경우 기능 모음입니다.
Feature Names − 기능의 모든 이름의 목록입니다.
Response− 기본적으로 특성 변수에 따라 달라지는 출력 변수입니다. 대상, 레이블 또는 출력이라고도합니다.
Response Vector− 응답 열을 나타내는 데 사용됩니다. 일반적으로 응답 열은 하나만 있습니다.
Target Names − 응답 벡터가 취할 수있는 값을 나타냅니다.
Scikit-learn에는 다음과 같은 예제 데이터 세트가 거의 없습니다. iris 과 digits 분류 및 Boston house prices 회귀를 위해.
예
다음은로드하는 예입니다. iris 데이터 세트 −
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names
target_names = iris.target_names
print("Feature names:", feature_names)
print("Target names:", target_names)
print("\nFirst 10 rows of X:\n", X[:10])
산출
Feature names: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
Target names: ['setosa' 'versicolor' 'virginica']
First 10 rows of X:
[
[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]
[5.4 3.9 1.7 0.4]
[4.6 3.4 1.4 0.3]
[5. 3.4 1.5 0.2]
[4.4 2.9 1.4 0.2]
[4.9 3.1 1.5 0.1]
]
데이터 세트 분할
모델의 정확성을 확인하기 위해 데이터 세트를 두 부분으로 나눌 수 있습니다.a training set 과 a testing set. 학습 세트를 사용하여 모델을 학습시키고 테스트 세트를 사용하여 모델을 테스트합니다. 그 후 모델이 얼마나 잘했는지 평가할 수 있습니다.
예
다음 예제는 데이터를 70:30 비율로 분할합니다. 즉, 70 % 데이터가 학습 데이터로 사용되고 30 %가 테스트 데이터로 사용됩니다. 데이터 세트는 위의 예에서와 같이 홍채 데이터 세트입니다.
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size = 0.3, random_state = 1
)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
산출
(105, 4)
(45, 4)
(105,)
(45,)
위의 예에서 볼 수 있듯이 train_test_split()데이터 세트를 분할하는 scikit-learn의 기능. 이 함수에는 다음 인수가 있습니다.
X, y − 여기, X 이다 feature matrix 그리고 y는 response vector, 분할해야합니다.
test_size− 이것은 주어진 데이터 전체에 대한 테스트 데이터의 비율을 나타냅니다. 위의 예에서와 같이test_data = 0.3 X의 150 행에 대해. 150 * 0.3 = 45 행의 테스트 데이터를 생성합니다.
random_size− 분할이 항상 동일 함을 보장하기 위해 사용됩니다. 이것은 재현 가능한 결과를 원하는 상황에서 유용합니다.
모델 훈련
다음으로 데이터 세트를 사용하여 예측 모델을 훈련 할 수 있습니다. 논의한 바와 같이 scikit-learn은Machine Learning (ML) algorithms 피팅, 정확도 예측, 리콜 등에 대한 일관된 인터페이스를 제공합니다.
예
아래 예에서는 KNN (K 개의 최근 접 이웃) 분류기를 사용합니다. KNN 알고리즘에 대해서는 별도의 장이 있으므로 자세히 설명하지 마십시오. 이 예제는 구현 부분 만 이해하는 데 사용됩니다.
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size = 0.4, random_state=1
)
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
classifier_knn = KNeighborsClassifier(n_neighbors = 3)
classifier_knn.fit(X_train, y_train)
y_pred = classifier_knn.predict(X_test)
# Finding accuracy by comparing actual response values(y_test)with predicted response value(y_pred)
print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
# Providing sample data and the model will make prediction out of that data
sample = [[5, 5, 3, 2], [2, 4, 3, 5]]
preds = classifier_knn.predict(sample)
pred_species = [iris.target_names[p] for p in preds] print("Predictions:", pred_species)
산출
Accuracy: 0.9833333333333333
Predictions: ['versicolor', 'virginica']
모델 지속성
모델을 학습 한 후에는 모델을 계속해서 다시 학습 할 필요가 없도록 나중에 사용할 수 있도록 유지하는 것이 바람직합니다. 다음의 도움으로 수행 할 수 있습니다.dump 과 load 의 특징 joblib 꾸러미.
위의 훈련 된 모델 (classifier_knn)을 향후 사용을 위해 저장하는 아래의 예를 고려하십시오.
from sklearn.externals import joblib
joblib.dump(classifier_knn, 'iris_classifier_knn.joblib')
위의 코드는 모델을 iris_classifier_knn.joblib라는 파일에 저장합니다. 이제 다음 코드를 사용하여 파일에서 객체를 다시로드 할 수 있습니다.
joblib.load('iris_classifier_knn.joblib')
데이터 전처리
우리는 많은 데이터를 다루고 있고 그 데이터는 원시 형태이기 때문에 해당 데이터를 기계 학습 알고리즘에 입력하기 전에 의미있는 데이터로 변환해야합니다. 이 프로세스를 데이터 전처리라고합니다. Scikit-learn에는preprocessing이 목적을 위해. 그만큼preprocessing 패키지에는 다음과 같은 기술이 있습니다.
이진화
이 전처리 기술은 숫자 값을 부울 값으로 변환해야 할 때 사용됩니다.
예
import numpy as np
from sklearn import preprocessing
Input_data = np.array(
[2.1, -1.9, 5.5],
[-1.5, 2.4, 3.5],
[0.5, -7.9, 5.6],
[5.9, 2.3, -5.8]]
)
data_binarized = preprocessing.Binarizer(threshold=0.5).transform(input_data)
print("\nBinarized data:\n", data_binarized)
위의 예에서 우리는 threshold value = 0.5이므로 0.5 이상의 모든 값은 1로 변환되고 0.5 미만의 모든 값은 0으로 변환됩니다.
산출
Binarized data:
[
[ 1. 0. 1.]
[ 0. 1. 1.]
[ 0. 0. 1.]
[ 1. 1. 0.]
]
평균 제거
이 기술은 모든 특성이 0에 집중되도록 특성 벡터에서 평균을 제거하는 데 사용됩니다.
예
import numpy as np
from sklearn import preprocessing
Input_data = np.array(
[2.1, -1.9, 5.5],
[-1.5, 2.4, 3.5],
[0.5, -7.9, 5.6],
[5.9, 2.3, -5.8]]
)
#displaying the mean and the standard deviation of the input data
print("Mean =", input_data.mean(axis=0))
print("Stddeviation = ", input_data.std(axis=0))
#Removing the mean and the standard deviation of the input data
data_scaled = preprocessing.scale(input_data)
print("Mean_removed =", data_scaled.mean(axis=0))
print("Stddeviation_removed =", data_scaled.std(axis=0))
산출
Mean = [ 1.75 -1.275 2.2 ]
Stddeviation = [ 2.71431391 4.20022321 4.69414529]
Mean_removed = [ 1.11022302e-16 0.00000000e+00 0.00000000e+00]
Stddeviation_removed = [ 1. 1. 1.]
스케일링
이 전처리 기술을 사용하여 특징 벡터의 크기를 조정합니다. 특성이 종합적으로 크거나 작 으면 안되므로 특성 벡터의 크기 조정이 중요합니다.
예
import numpy as np
from sklearn import preprocessing
Input_data = np.array(
[
[2.1, -1.9, 5.5],
[-1.5, 2.4, 3.5],
[0.5, -7.9, 5.6],
[5.9, 2.3, -5.8]
]
)
data_scaler_minmax = preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled_minmax = data_scaler_minmax.fit_transform(input_data)
print ("\nMin max scaled data:\n", data_scaled_minmax)
산출
Min max scaled data:
[
[ 0.48648649 0.58252427 0.99122807]
[ 0. 1. 0.81578947]
[ 0.27027027 0. 1. ]
[ 1. 0.99029126 0. ]
]
표준화
특징 벡터를 수정하기 위해이 전처리 기술을 사용합니다. 특징 벡터의 정규화는 특징 벡터가 공통 스케일에서 측정 될 수 있도록 필요합니다. 다음과 같은 두 가지 유형의 정규화가 있습니다.
L1 정규화
최소 절대 편차라고도합니다. 절대 값의 합이 항상 각 행에서 최대 1로 유지되도록 값을 수정합니다. 다음 예제는 입력 데이터에 대한 L1 정규화 구현을 보여줍니다.
예
import numpy as np
from sklearn import preprocessing
Input_data = np.array(
[
[2.1, -1.9, 5.5],
[-1.5, 2.4, 3.5],
[0.5, -7.9, 5.6],
[5.9, 2.3, -5.8]
]
)
data_normalized_l1 = preprocessing.normalize(input_data, norm='l1')
print("\nL1 normalized data:\n", data_normalized_l1)
산출
L1 normalized data:
[
[ 0.22105263 -0.2 0.57894737]
[-0.2027027 0.32432432 0.47297297]
[ 0.03571429 -0.56428571 0.4 ]
[ 0.42142857 0.16428571 -0.41428571]
]
L2 정규화
최소 제곱이라고도합니다. 제곱의 합이 각 행에서 항상 최대 1로 유지되도록 값을 수정합니다. 다음 예제는 입력 데이터에 대한 L2 정규화 구현을 보여줍니다.
예
import numpy as np
from sklearn import preprocessing
Input_data = np.array(
[
[2.1, -1.9, 5.5],
[-1.5, 2.4, 3.5],
[0.5, -7.9, 5.6],
[5.9, 2.3, -5.8]
]
)
data_normalized_l2 = preprocessing.normalize(input_data, norm='l2')
print("\nL1 normalized data:\n", data_normalized_l2)
산출
L2 normalized data:
[
[ 0.33946114 -0.30713151 0.88906489]
[-0.33325106 0.53320169 0.7775858 ]
[ 0.05156558 -0.81473612 0.57753446]
[ 0.68706914 0.26784051 -0.6754239 ]
]