import seaborn as sns
iris = sns.load_dataset('iris')
iris.head()Scikit-Learn 소개
다양한 머신러닝 알고리즘의 안정적인 구현을 제공하는 여러 파이썬 라이브러리가 있습니다. 가장 잘 알려진 것 중 하나는 다수의 일반적인 알고리즘을 효율적으로 구현해 제공하는 패키지인 Scikit-Learn입니다. Scikit-Learn은 매우 유용하고 방대한 온라인 문서뿐만 아니라 깔끔하고 균일하며 간소화된 API가 특징입니다. 이러한 일관성 덕분에 한 가지 모델 유형에 대한 Scikit-Learn의 기본 사용법과 구문을 이해하고 나면 새로운 모델이나 알고리즘으로 전환하는 것이 매우 간단합니다.
이 장에서는 Scikit-Learn API의 개요를 살펴봅니다. 이러한 API 요소에 대한 확실한 이해는 다음 장에서 머신러닝 알고리즘 및 접근 방식에 대해 보다 심층적이고 실용적으로 논의할 때 밑바탕이 됩니다.
먼저 Scikit-Learn의 데이터 표현 방식을 다룬 다음 추정기(Estimator) API를 자세히 살펴보고, 마지막으로 손으로 쓴 숫자 이미지 세트를 탐색하기 위해 이러한 도구를 사용하는 흥미로운 예제를 살펴보겠습니다.
Scikit-Learn의 데이터 표현
머신러닝은 데이터로부터 모델을 구축하는 과정입니다. 따라서 먼저 데이터를 표현하는 방법에 대해 살펴보겠습니다. Scikit-Learn에서 데이터를 생각하는 가장 좋은 방법은 테이블을 사용하는 것입니다.
기본 테이블은 데이터의 2차원 그리드로, 행은 데이터 세트의 개별 요소를 나타내고 열은 각 요소와 관련된 수량을 나타냅니다. 예를 들어, 1936년 로널드 피셔(Ronald Fisher)가 분석한 것으로 유명한 붓꽃(Iris) 데이터 세트를 생각해 봅시다. Seaborn 라이브러리를 사용하여 Pandas DataFrame 형식으로 이 데이터 세트를 불러오고 처음 몇 개의 항목을 살펴볼 수 있습니다.
여기서 데이터의 각 행은 관찰된 개별 꽃을 나타내며, 행의 총합은 데이터 세트에 포함된 전체 꽃의 수입니다. 일반적으로 행렬의 행은 샘플(samples)이라 부르고, 그 수를 n_samples로 나타냅니다.
마찬가지로 데이터의 각 열은 각 샘플을 설명하는 정량적 정보를 나타냅니다. 일반적으로 행렬의 열은 특성(features)이라 부르고, 그 수를 n_features로 나타냅니다.
특성 행렬
테이블 레이아웃은 데이터가 2차원 숫자 배열 또는 행렬(특성 행렬이라 함)로 간주될 수 있음을 명확히 보여줍니다. 관례상 이 행렬은 주로 X라는 변수에 저장합니다. 특성 행렬은 [n_samples, n_features] 형태의 2차원 구조로 가정하며, 주로 NumPy 배열이나 Pandas DataFrame에 저장되지만, 일부 Scikit-Learn 모델은 SciPy 희소 행렬도 허용합니다.
샘플(행)은 항상 데이터 세트에서 설명하는 개별 객체를 나타냅니다. 예를 들어 샘플은 꽃, 사람, 문서, 이미지, 오디오 파일, 비디오, 천체 등 정량적 측정이 가능한 모든 것이 될 수 있습니다.
특성(열)은 항상 각 샘플을 정량적으로 설명하는 고유한 관찰 항목을 나타냅니다. 특성은 주로 실수 값이지만, 경우에 따라 부울(boolean) 값이나 이산 값일 수도 있습니다.
대상 배열
특성 행렬 X 외에도 일반적으로 레이블(label) 또는 대상(target) 배열을 함께 다루며, 보통 이를 y라고 부릅니다. 대상 배열은 일반적으로 길이가 n_samples인 1차원 구조이며, 보통 NumPy 배열이나 Pandas Series에 저장됩니다. 대상 배열에는 연속적인 숫자 값이 포함되거나 이산적인 클래스/레이블이 포함될 수 있습니다. 일부 Scikit-Learn 추정기는 2차원 [n_samples, n_targets] 형태의 다중 대상 값을 처리하기도 하지만, 여기서는 주로 1차원 대상 배열인 일반적인 경우를 다룰 것입니다.
자주 혼동하는 점은 대상 배열이 다른 특성 열과 어떻게 다른가 하는 것입니다. 대상 배열의 가장 큰 특징은 우리가 특성으로부터 예측하고자 하는 수량이라는 점입니다. 즉, 통계학적 관점에서는 종속 변수에 해당합니다. 예를 들어, 앞선 데이터가 주어졌을 때 다른 측정값을 기반으로 꽃의 종을 예측하는 모델을 구축합니다. 이 경우 species 열이 대상 배열로 간주됩니다.
이러한 대상 배열을 염두에 두고 Seaborn(Seaborn을 이용한 시각화 참고)을 사용하여 데이터를 편리하게 시각화합니다(다음 그림 참고).
import seaborn as sns
%matplotlib inline
sns.pairplot(iris, hue='species', height=1.5);Scikit-Learn에서 사용하기 위해 DataFrame에서 특성 행렬과 대상 배열을 추출합니다. 이는 3부에서 설명한 Pandas DataFrame 작업의 일부를 사용하여 수행합니다.
X_iris = iris.drop('species', axis=1)
X_iris.shapey_iris = iris['species']
y_iris.shape요약하자면, 예상되는 특성 및 대상 값의 구조가 다음 그림에 잘 나타나 있습니다.
데이터의 형식이 적절히 갖춰지면 Scikit-Learn의 추정기(Estimator) API를 사용합니다.
추정기 API
Scikit-Learn API는 Scikit-Learn API 문서에 설명된 대로 다음과 같은 설계 원칙을 바탕으로 설계되었습니다.
일관성: 모든 객체는 일관된 문서를 바탕으로 제한된 메서드 집합에서 가져온 공통 인터페이스를 공유합니다.
검사 가능성: 지정된 모든 매개변수 값이 공개 속성으로 노출됩니다.
제한된 객체 계층 구조: 알고리즘만 파이썬 클래스로 표현됩니다. 데이터 세트는 표준 형식(NumPy 배열, Pandas
DataFrame, SciPy 희소 행렬)으로 표현되며, 매개변수 이름은 표준 파이썬 문자열을 사용합니다.구성: 많은 머신러닝 작업은 보다 기본적인 알고리즘의 시퀀스로 표현될 수 있으며, Scikit-Learn은 가능한 경우 이를 활용합니다.
합리적인 기본값: 모델에 사용자 정의 매개변수가 필요한 경우 라이브러리는 적절한 기본값을 정의합니다.
실제로 이러한 원칙을 이해하면 Scikit-Learn을 매우 쉽게 사용합니다. Scikit-Learn의 모든 머신러닝 알고리즘은 광범위한 머신러닝 애플리케이션에 일관된 인터페이스를 제공하는 추정기(Estimator) API를 통해 구현됩니다.
API 기초
일반적으로 Scikit-Learn 추정기 API를 사용하는 단계는 다음과 같습니다.
- Scikit-Learn에서 적절한 추정기 클래스를 불러와 모델 클래스를 선택합니다.
- 모델 클래스를 인스턴스화하면서 원하는 하이퍼파라미터를 선택합니다.
- 데이터를 특성 행렬과 대상 벡터로 구성합니다.
- 모델 인스턴스의
fit()메서드를 호출하여 모델을 데이터에 적합시킵니다. - 새로운 데이터에 모델을 적용합니다.
- 지도 학습의 경우
predict()메서드를 사용하여 알려지지 않은 데이터의 레이블을 예측합니다. - 비지도 학습의 경우
transform()이나predict()메서드를 사용하여 데이터의 속성을 변환하거나 추론합니다.
- 지도 학습의 경우
이제 지도 및 비지도 학습 방법을 적용하는 간단한 예제를 단계별로 살펴보겠습니다.
지도 학습 예제: 단순 선형 회귀
이 과정의 예로 간단한 선형 회귀, 즉 \((x, y)\) 데이터에 선을 적합시키는 일반적인 경우를 고려해 보겠습니다. 회귀 예제에서는 다음과 같은 간단한 데이터를 사용합니다(다음 그림 참고).
import matplotlib.pyplot as plt
import numpy as np
rng = np.random.RandomState(42)
x = 10 * rng.rand(50)
y = 2 * x - 1 + rng.randn(50)
plt.scatter(x, y);이 데이터가 준비되면 앞서 설명한 절차를 적용합니다. 그 과정을 살펴보겠습니다.
1. 모델 클래스 선택
Scikit-Learn의 모든 모델은 파이썬 클래스로 표현됩니다. 예를 들어, 단순한 선형 회귀 모델을 사용하려면 다음과 같이 LinearRegression 클래스를 불러올 수 있습니다.
from sklearn.linear_model import LinearRegression그 외에도 다양한 선형 회귀 모델이 존재합니다. 자세한 내용은 sklearn.linear_model 모듈 문서에서 확인합니다.
2. 모델 하이퍼파라미터 선택
모델의 클래스가 곧 모델의 인스턴스는 아니라는 것입니다.
모델 클래스를 결정한 후에도 몇 가지 선택 사항이 남습니다. 사용하려는 모델 클래스에 따라 다음과 같은 질문에 답해야 할 수도 있습니다.
- 오프셋(즉, y 절편)을 적합시킬 것인가?
- 모델을 정규화할 것인가?
- 모델의 유연성을 높이기 위해 특성을 전처리할 것인가?
- 모델에 어느 정도의 정규화 강도를 사용할 것인가?
- 얼마나 많은 모델 구성 요소를 사용할 것인가?
이것들은 모델 클래스가 선택된 후에 이루어져야 하는 중요한 선택의 예입니다. 이러한 선택 사항을 보통 하이퍼파라미터(hyperparameters), 즉 모델이 데이터에 적합되기 전에 미리 설정해야 하는 매개변수라고 합니다. Scikit-Learn에서는 모델 인스턴스화 시점에 값을 전달하여 하이퍼파라미터를 선택합니다. 하이퍼파라미터 및 모델 검증에서 하이퍼파라미터를 정량적으로 선택하는 방법을 살펴보겠습니다.
선형 회귀 예제에서는 LinearRegression 클래스를 인스턴스화하고 fit_intercept 하이퍼파라미터를 사용하여 절편을 적합시키도록 지정합니다.
model = LinearRegression(fit_intercept=True)
model모델이 인스턴스화될 때 수행되는 유일한 작업은 이러한 하이퍼파라미터 값을 저장하는 것입니다. 아직 어떤 데이터에도 모델을 적용하지 않았으며, Scikit-Learn API는 모델 선택과 모델의 데이터 적합 사이의 구분을 매우 명확히 합니다.
3. 데이터를 특성 행렬과 목표 벡터로 구성합니다.
앞서 2차원 특성 행렬과 1차원 목표 배열을 필요로 하는 Scikit-Learn 데이터 표현 방식을 살펴봤습니다. 여기서 목표 변수 y는 이미 올바른 형식(길이-n_samples 배열)이지만 데이터 x를 가공하여 [n_samples, n_features] 크기의 행렬로 만들어야 합니다. 이 경우, 이는 1차원 배열을 간단히 재구성하는 과정과 같습니다.
X = x[:, np.newaxis]
X.shape4. 모델을 데이터에 적합시킵니다.
이제 모델을 데이터에 적용할 차례입니다. 이 작업은 모델의 fit() 메서드를 사용하여 수행합니다.
model.fit(X, y)이 fit() 명령을 실행하면, 모델 내부에서 여러 계산이 이루어지며, 그 결과는 사용자가 탐색할 수 있는 모델별 속성에 저장됩니다. Scikit-Learn에서는, fit() 과정에서 학습된 모든 모델 매개변수에 밑줄(_)을 붙이는 관례가 있습니다. 예를 들어, 이 선형 모델에는 다음과 같은 속성값이 있습니다.
model.coef_이 두 매개변수는 데이터에 대한 단순 선형 적합의 기울기와 절편을 나타냅니다. 결과를 데이터 정의와 비교하면, 데이터 생성에 사용된 값인 기울기 2와 절편 -1에 가깝다는 것을 알 수 있습니다.
자주 제기되는 질문 중 하나는 이러한 내부 모델 매개변수의 불확실성에 관한 것입니다. 일반적으로 Scikit-Learn은 내부 모델 매개변수 자체에서 결론을 도출하는 도구를 제공하지 않습니다. 모델 매개변수 해석은 머신러닝 질문이라기보다는 통계적 모델링 질문에 훨씬 가깝습니다. 대신 머신러닝은 모델이 예측하는 것에 중점을 둡니다. 모델 적합 매개변수의 의미를 자세히 알아보려면 statsmodels 파이썬 패키지를 비롯한 다른 도구를 사용합니다.
5. 알 수 없는 데이터에 대한 레이블 예측
모델이 훈련되면 지도 머신러닝의 핵심은 훈련 세트에 포함되지 않은 새로운 데이터에 대해 모델이 어떠한 예측을 하는지를 평가하는 것입니다. Scikit-Learn에서는 predict() 메서드를 사용하여 이를 수행합니다. 이 예시에서, “새로운 데이터”는 x 값의 그리드가 되며, 모델이 예측하는 y 값이 무엇인지 묻습니다.
xfit = np.linspace(-1, 11)
Xfit = xfit[:, np.newaxis]
yfit = model.predict(Xfit)plt.scatter(x, y)
plt.plot(xfit, yfit);마지막으로, 원시 데이터를 시각화한 다음, 이 모델을 적합시켜 그 결과를 시각화해 보겠습니다(다음 그림 참고).
일반적으로 모델의 성능은 다음 예에서 볼 수 있듯이, 결과를 알려진 기준선과 비교하여 평가합니다.
지도 학습 예시: 붓꽃 분류
앞서 논의한 붓꽃(Iris) 데이터 세트를 사용하여, 이 프로세스의 또 다른 예를 살펴보겠습니다. 우리의 질문은 다음과 같습니다. 붓꽃 데이터의 일부에 대해 훈련된 모델이 주어졌을 때, 나머지 레이블을 얼마나 잘 예측할 수 있을까요?
이 작업에서는 가우시안 나이브 베이즈(Gaussian naive Bayes)라는 간단한 생성 모델을 사용합니다. 이 모델은 각 클래스가 축 정렬된 가우스 분포에서 추출된다고 가정합니다(자세한 내용은 심층: 나이브 베이즈 분류 참조). 매우 빠르고, 선택할 하이퍼파라미터가 거의 없기 때문에, 가우시안 나이브 베이즈는 보다 정교한 모델을 통해 개선 사항을 찾을 수 있는지 탐색하기 전에, 기준 분류로 사용하기에 좋은 모델인 경우가 많습니다.
이전에 보지 못한 데이터로 모델을 평가하고 싶기 때문에, 데이터를 훈련 세트(training set)와 테스트 세트(test set)로 나눌 것입니다. 이 작업은 직접 수행할 수도 있지만, train_test_split 유틸리티 함수를 사용하는 것이 더 편리합니다.
from sklearn.model_selection import train_test_split
Xtrain, Xtest, ytrain, ytest = train_test_split(X_iris, y_iris, random_state=0)from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
model.fit(Xtrain, ytrain)데이터가 준비되면, 절차에 따라 레이블을 예측합니다.
y_model = model.predict(Xtest)from sklearn.metrics import accuracy_score
accuracy_score(ytest, y_model)97%에 달하는 정확도로, 매우 단순한 분류 알고리즘조차 이 특정 데이터 세트에서 효과적이라는 것을 알 수 있습니다!
비지도 학습 예시: 붓꽃 차원 축소
다음으로 붓꽃 데이터의 차원을 줄여, 시각화를 더 쉽게 만드는 비지도 학습의 한 예시를 살펴보겠습니다. 붓꽃 데이터는 4차원입니다. 즉, 각 샘플에 대해 4개의 특성이 기록됩니다.
차원 축소는 데이터의 필수적인 특징을 유지하는 적절한 저차원 표현이 있는지 확인하는 데 중점을 둡니다. 종종 차원 축소는 데이터 시각화를 돕기 위해 사용됩니다. 데이터를 4차원 이상으로 그리는 것보다, 2차원으로 그리는 것이 훨씬 쉽기 때문입니다!
여기서는 고속 선형 차원 축소 기법인 *주성분 분석(PCA, 심층: 주성분 분석 참조)을 사용합니다. 모델에 2개의 구성 요소, 즉 데이터의 2차원 표현을 반환하도록 요청합니다.
앞서 설명한 일련의 단계를 따르면 다음과 같습니다.
from sklearn.decomposition import PCA
model = PCA(n_components=2)
model.fit(X_iris)
X_2D = model.transform(X_iris)iris['PCA1'] = X_2D[:, 0]
iris['PCA2'] = X_2D[:, 1]
sns.lmplot(
'PCA1', 'PCA2', data=iris, hue='species', fit_reg=False
);PCA 알고리즘이 종 레이블에 대한 정보 없이도, 2차원 표현에서 각 종이 상당히 잘 분리되어 있음을 확인합니다! 이것은 앞서 살펴본 단순한 분류 방식이 이 데이터 세트에서 효과적일 수 있음을 시사합니다.
비지도 학습 예시: 붓꽃 클러스터링
다음으로 붓꽃 데이터에 클러스터링을 적용하는 방법을 살펴보겠습니다. 클러스터링 알고리즘은 레이블을 참조하지 않고, 고유한 데이터 그룹을 찾으려고 시도합니다. 여기서는 가우시안 혼합 모델(GMM)이라는 강력한 클러스터링 방법을 사용합니다. 자세한 내용은 심층: 가우시안 혼합 모델에서 설명합니다. GMM은 데이터를 가우시안 군집(Gaussian blob) 모음으로 모델링하려고 시도합니다.
가우시안 혼합 모델은 다음과 같이 적합시킬 수 있습니다.
from sklearn.mixture import GaussianMixture
model = GaussianMixture(n_components=3, covariance_type='full')
model.fit(X_iris)
y_gmm = model.predict(X_iris)iris['cluster'] = y_gmm
sns.lmplot(
'PCA1', 'PCA2', data=iris, hue='species', col='cluster', fit_reg=False
);데이터를 클러스터 번호로 분할함으로써, GMM 알고리즘이 기본 레이블을 얼마나 잘 찾아냈는지 정확하게 확인합니다. setosa 종은 클러스터 0 내에서 완벽하게 분리되는 반면, versicolor와 virginica 사이에는 약간의 혼합이 남아 있습니다. 이는 전문가가 개별 꽃의 종 레이블을 알려주지 않아도, 이러한 꽃의 측정값이 충분히 뚜렷하기 때문에, 간단한 클러스터링 알고리즘을 사용하여, 이러한 다양한 종 그룹의 존재를 자동으로 식별할 수 있다는 의미입니다! 이러한 종류의 알고리즘은 현장 전문가에게 관찰 중인 샘플 간의 관계에 대한 단서를 제공합니다.
응용: 손글씨 숫자 탐구
보다 흥미로운 문제에 대한 이러한 원리를 확인하기 위해, 광학 문자 인식 문제의 일부인 손글씨 숫자 식별을 고려해 보겠습니다. 이 문제는 이미지에서 문자를 찾고, 식별하는 것과 관련이 있습니다. 여기서는 Scikit-Learn 라이브러리에 내장된 미리 준비된 숫자 세트를 사용하기 위해 바로 가기를 사용할 것입니다.
숫자 데이터 로드 및 시각화
Scikit-Learn의 데이터 액세스 인터페이스를 사용하여 이 데이터를 살펴볼 수 있습니다.
from sklearn.datasets import load_digits
digits = load_digits()digits.images.shapedigits.images[0]digits.data.shapedigits.data[0].reshape(8, 8)fig, axes = plt.subplots(10, 10, figsize=(8, 8))
for i, ax in enumerate(axes.flat):
ax.imshow(digits.images[i], cmap='binary')
ax.set(xticks=[], yticks=[])이미지 데이터는 3차원 배열입니다. 즉, 각각 8×8 픽셀 그리드로 구성된 1,797개의 샘플입니다. 이 중 처음 100개를 시각화해 보겠습니다(다음 그림 참조).
fig, axes = plt.subplots(10, 10, figsize=(8, 8))
for i, ax in enumerate(axes.flat):
ax.imshow(digits.images[i], cmap='binary')
ax.set(xticks=[], yticks=[])Scikit-Learn 내에서 이 데이터를 사용하려면, 2차원 [n_samples, n_features] 표현이 필요합니다. 이것은 이미지의 각 픽셀을 특성으로 간주하여 수행합니다. 즉, 픽셀 배열을 평탄화하여, 각 숫자를 나타내는 픽셀 값의 길이가 64인 배열을 갖게 됩니다. 또한, 각 숫자에 대해 이전에 결정된 레이블을 제공하는 대상 배열이 필요합니다. 이 두 가지 값은, 각각 data와 target 속성 아래, 숫자 데이터 세트에 내장되어 있습니다.
X = digits.data
X.shapey = digits.target
y.shape여기서 1,797개의 샘플과 64개의 특성이 있음을 알 수 있습니다.
비지도 학습 예시: 차원 축소
우리는 64차원 매개변수 공간 내에서 점을 시각화하고 싶지만, 이러한 고차원 공간에서는 점을 효과적으로 시각화하는 것이 어렵습니다. 대신, 비지도 방식을 사용하여 차원 수를 줄입니다. 여기서는 Isomap이라는 다양한 학습 알고리즘(심층: 매니폴드 학습 참조)을 사용하고, 데이터를 2차원으로 변환합니다.
from sklearn.manifold import Isomap
iso = Isomap(n_components=2)
iso.fit(digits.data)
digits_proj = iso.transform(digits.data)digits_proj.shapeplt.scatter(digits_proj[:, 0], digits_proj[:, 1], c=digits.target,
cmap=plt.cm.get_cmap('cubehelix', 10))
plt.colorbar(ticks=range(10), label='digit value');이제 투영된 데이터가 2차원임을 확인합니다. 이 데이터를 시각화하여 구조에서 무엇을 배울 수 있는지 살펴보겠습니다(다음 그림 참조).
이 플롯은 더 큰 64차원 공간에서 각 숫자가 얼마나 잘 구분되는지에 대한 직관을 제공합니다. 예를 들어 0과 1은 매개변수 공간에서 거의 겹치지 않습니다. 직관적으로 이것은 의미가 있습니다. 0은 이미지 중앙이 비어 있는 반면, 1은 일반적으로 중앙에 잉크가 채워져 있습니다. 반면에 1과 4 사이에는 다소 연속적인 스펙트럼이 있는 것 같습니다. 어떤 사람들은 “모자”가 있는 1을 그리므로 4와 유사하게 보인다는 사실을 통해, 이를 이해합니다.
그러나 전반적으로, 가장자리에서의 일부 혼합에도 불구하고, 다양한 그룹은 매개변수 공간에서 상당히 잘 구분되어 보입니다. 이는 매우 간단한 지도 분류 알고리즘이라도, 전체 고차원 데이터 세트에서 적절하게 수행되어야 함을 의미합니다. 한번 시도해 봅시다.
숫자 분류
이제 숫자 데이터에 분류 알고리즘을 적용해 보겠습니다. 이전에 붓꽃 데이터에서 했던 것처럼, 데이터를 훈련 세트와 테스트 세트로 나누고, 가우시안 나이브 베이즈 모델을 적용합니다.
from sklearn.naive_bayes import GaussianNB
Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, random_state=0)
model = GaussianNB()
model.fit(Xtrain, ytrain)
y_pred = model.predict(Xtest)y_pred = model.predict(Xtest)이제 모델의 예측이 완료되었으므로, 테스트 세트의 실제 값과 예측 값을 비교하여 정확도를 측정합니다.
from sklearn.metrics import accuracy_score
accuracy_score(ytest, y_pred)이 매우 간단한 모델로도 숫자 분류에 대해 약 83%의 정확도를 얻었습니다! 하지만 이 단일 숫자로는, 우리가 어디에서 잘못했는지 알 수 없습니다. 이를 수행하는 한 가지 좋은 방법은, Scikit-Learn으로 계산하고 Seaborn으로 시각화할 수 있는, 혼동 행렬을 사용하는 것입니다(다음 그림 참조).
from sklearn.metrics import confusion_matrix
mat = confusion_matrix(ytest, y_pred)
sns.heatmap(mat, square=True, annot=True, cbar=False)
plt.xlabel('predicted value')
plt.ylabel('true value');이 혼동 행렬은 레이블이 잘못 지정된 지점이 어디인지 보여줍니다. 예를 들어, 여기 있는 2개의 숫자 중 다수가, 1 또는 8로 잘못 분류되었습니다.
모델의 특성에 대한 직관을 얻는 또 다른 방법은, 예측된 레이블을 사용하여 입력 데이터를 다시 시각화하는 것입니다. 올바른 레이블에는 녹색을 사용하고, 잘못된 레이블에는 빨간색을 사용합니다. 다음 그림을 참조하세요.
fig, axes = plt.subplots(10, 10, figsize=(8, 8))
for i, ax in enumerate(axes.flat):
ax.imshow(digits.images[i], cmap='binary')
ax.set(xticks=[], yticks=[])
ax.set_ylabel(digits.target[i])
if ytest[i] == y_pred[i]:
color = 'green'
else:
color = 'red'
ax.set_facecolor(color)데이터의 이 하위 집합을 살펴보면, 알고리즘이 최적으로 수행되지 않는 부분에 대한 통찰력을 얻을 수 있습니다. 83%의 분류 성공률을 뛰어넘기 위해, 서포트 벡터 머신(심층: 지원 벡터 머신 참조), 랜덤 포레스트(심층: 결정 트리 및 랜덤 포레스트 참조), 또는 다른 분류 접근 방식과 같은, 보다 정교한 알고리즘으로 전환합니다.
요약
이번 장에서는 Scikit-Learn 데이터 표현과 추정기(Estimator) API의 핵심 기능을 다루었습니다. 사용되는 추정기 유형에 관계없이, 동일한 가져오기/인스턴스화/적합/예측 패턴이 유지됩니다. 추정기 API에 대한 정보를 바탕으로, Scikit-Learn 문서를 탐색하고, 데이터에 대한 다양한 모델을 시험해 살펴볼 수 있습니다.
다음 장에서는, 머신러닝에서 가장 중요한 주제 중 하나인 모델을 선택하고, 검증하는 방법을 살펴보겠습니다.