Scikit Learn-모델링 프로세스

이 장에서는 Sklearn과 관련된 모델링 프로세스를 다룹니다. 이에 대해 자세히 이해하고 데이터 세트로드부터 시작하겠습니다.

데이터 세트로드

데이터 모음을 데이터 세트라고합니다. 그것은 다음 두 가지 구성 요소를 가지고 있습니다-

Features− 데이터의 변수를 특성이라고합니다. 예측 자, 입력 또는 속성이라고도합니다.

  • Feature matrix − 하나 이상의 기능이있는 경우 기능 모음입니다.

  • Feature Names − 기능의 모든 이름의 목록입니다.

Response− 기본적으로 특성 변수에 따라 달라지는 출력 변수입니다. 대상, 레이블 또는 출력이라고도합니다.

  • Response Vector− 응답 열을 나타내는 데 사용됩니다. 일반적으로 응답 열은 하나만 있습니다.

  • Target Names − 응답 벡터가 취할 수있는 값을 나타냅니다.

Scikit-learn에는 다음과 같은 예제 데이터 세트가 거의 없습니다. irisdigits 분류 및 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 seta 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']

모델 지속성

모델을 학습 한 후에는 모델을 계속해서 다시 학습 할 필요가 없도록 나중에 사용할 수 있도록 유지하는 것이 바람직합니다. 다음의 도움으로 수행 할 수 있습니다.dumpload 의 특징 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 ]
]