--08.scikit learn.ipynb--

| 모듈 | 설명 |
|---|---|
sklearn.datasets | 내장된 예제 데이터 세트 |
sklearn.preprocessing | 다양한 데이터 전처리 기능 제공 (변환, 정규화, 스케일링 등) |
sklearn.feature_selection | 특징(feature)를 선택할 수 있는 기능 제공 |
sklearn.feature_extraction | 특징(feature) 추출에 사용 |
sklearn.decomposition | 차원 축소 관련 알고리즘 지원 (PCA, NMF, Truncated SVD 등) |
sklearn.model_selection | 교차 검증을 위해 데이터를 학습/테스트용으로 분리, 최적 파라미터를 추출하는 API 제공 (GridSearch 등) |
sklearn.metrics | 분류, 회귀, 클러스터링, Pairwise에 대한 다양한 성능 측정 방법 제공 (Accuracy, Precision, Recall, ROC-AUC, RMSE 등) |
sklearn.pipeline | 특징 처리 등의 변환과 ML 알고리즘 학습, 예측 등을 묶어서 실행할 수 있는 유틸리티 제공 |
sklearn.linear_model | 선형 회귀, 릿지(Ridge), 라쏘(Lasso), 로지스틱 회귀 등 회귀 관련 알고리즘과 SGD(Stochastic Gradient Descent) 알고리즘 제공 |
sklearn.svm | 서포트 벡터 머신 알고리즘 제공 |
sklearn.neighbors | 최근접 이웃 알고리즘 제공 (k-NN 등) |
sklearn.naive_bayes | 나이브 베이즈 알고리즘 제공 (가우시안 NB, 다항 분포 NB 등) |
sklearn.tree | 의사 결정 트리 알고리즘 제공 |
sklearn.ensemble | 앙상블 알고리즘 제공 (Random Forest, AdaBoost, GradientBoost 등) |
sklearn.cluster | 비지도 클러스터링 알고리즘 제공 (k-Means, 계층형 클러스터링, DBSCAN 등) |
estimator APIestimator 클래스를 임포트해서 모델의 클래스 선택fit() 메서드를 호출해 모델을 데이터에 적합predict() 메서드를 사용해 알려지지 않은 데이터에 대한 레이블 예측transform()이나 predict() 메서드를 사용해 데이터의 속성을 변환하거나 추론
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
plt.style.use(['seaborn-whitegrid']) # 원하는 스타일 지정
x = 10 np.random.rand(50)
y = 2 x + np.random.rand(50)
plt.scatter(x,y)
estimator 클래스를 임포트해서 모델의 클래스 선택from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=True)
model
x
X = x[:, np.newaxis]
X
X[0]
y
fit() 메서드를 호출해 모델을 데이터에 적합(fit)model.get_params()
model.fit(X, y)
model.coef_
model.intercept_
xfit = np.linspace(-1, 11)
xfit
Xfit = xfit[:, np.newaxis]
yfit = model.predict(Xfit)
yfit
plt.scatter(x, y) # 학습 데이터
plt.plot(xfit, yfit, '--r') # 예측값
| API | 설명 |
|---|---|
datasets.load_boston() | 미국 보스턴의 집에 대한 특징과 가격 데이터 (회귀용) |
datasets.load_breast_cancer() | 위스콘신 유방암 특징들과 악성/음성 레이블 데이터 (분류용) |
datasets.load_diabetes() | 당뇨 데이터 (회귀용) |
datasets.load_digits() | 0에서 9까지 숫자 이미지 픽셀 데이터 (분류용) |
datasets.load_iris() | 붓꽃에 대한 특징을 가진 데이터 (분류용) |
| API | 설명 |
|---|---|
fetch_california_housing() | 캘리포니아 주택 가격 데이터 |
fetch_covtype() | 회귀 분석용 토지 조사 데이터 |
fetch_20newsgroups() | 뉴스 그룹 텍스트 데이터 |
fetch_olivetti_faces() | 얼굴 이미지 데이터 |
fetch_lfw_people() | 얼굴 이미지 데이터 |
fetch_lfw_paris() | 얼굴 이미지 데이터 |
fetch_rcv1() | 로이터 뉴스 말뭉치 데이터 |
fetch_mldata() | ML 웹사이트에서 다운로드 |
from sklearn.datasets import load_diabetes
diabetes = load_diabetes() # 결과 dict 형태
diabetes.keys()
diabetes.data
diabetes.target # target값은 수치형! => 이건 '회귀' 문제다!
len(diabetes.data), len(diabetes.target)
print(diabetes.DESCR)
diabetes.feature_names
diabetes.data[0]
model_selection 모듈from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
diabetes.data, diabetes.target, test_size=0.3
)
len(X_train), len(y_train)
len(X_test), len(y_test)
model = LinearRegression()
model.fit(X_train, y_train)
model.score(X_train, y_train)
model.score(X_test, y_test)
predicted = model.predict(X_test)
expected = y_test
plt.scatter(expected, predicted)
plt.plot([0, 500], [0,500], '--r')
![]()
![]()
from sklearn.model_selection import cross_val_score, cross_validate
scores = cross_val_score(model, diabetes.data, diabetes.target, cv=5)
scores
np.mean(scores), np.std(scores)
최적의 하이퍼 파라미터값 찾기
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import Ridge # Ridge 모델은 alpha라는 하이퍼 파라미터를 갖고있음.
Ridge().get_params()
alpha= [0.001, 0.01, 0.1, 1, 10, 100, 1000]
param_grid = dict(alpha = alpha)
param_grid
gs = GridSearchCV(estimator = Ridge(), param_grid = param_grid, cv = 10)
result = gs.fit(diabetes.data, diabetes.target)
result.bestscore # 최적의 점수
result.bestparams
result.bestestimator
pd.DataFrame(result.cvresults)
import multiprocessing
from sklearn.datasets import load_iris # 붗꽃 품종 데이터(분류형)
from sklearn.linear_model import LogisticRegression
iris = load_iris()
iris.data
iris.feature_names
iris.target
print(iris.DESCR)
LogisticRegression().get_params()
param_grid = [{
'penalty' : ['l1', 'l2'],
'C' : [0.5, 1.0, 1.5, 1.8, 2.0, 2.4]
}]
multiprocessing.cpu_count()
gs = GridSearchCV(estimator=LogisticRegression(), param_grid=param_grid, cv=10,
scoring='accuracy',
n_jobs = multiprocessing.cpu_count()
)
result = gs.fit(iris.data, iris.target)
result.bestscore
result.bestparams
pd.DataFrame(result.cvresults)
LogisticRegression(C=2.4, penalty='l2')
LogisticRegression(**result.bestparams)
데이터 전처리 모듈
![]()
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df
iris_df.describe()
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
iris_scaled = scaler.fit_transform(iris_df) # 스케일링된 결과 리턴(array 형태로.)
iris_scaled.shape
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns = iris.feature_names)
iris_df_scaled
iris_df_scaled.describe()
X_train, X_test, y_train, y_test = \
train_test_split(iris_df_scaled, iris.target, test_size = 0.3)
model = LogisticRegression()
model.fit(X_train, y_train)
model.score(X_train, y_train)
model.score(X_test, y_test)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
fit_scaler = scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
iris_df_scaled = pd.DataFrame(data = iris_scaled, columns = iris.feature_names)
iris_df_scaled.describe()
X_train, X_test, y_train, y_test = \
train_test_split(iris_df_scaled, iris.target, test_size = 0.3)
model = LogisticRegression()
model.fit(X_train, y_train)
print('훈련 데이터 점수 : {}'.format(model.score(X_train, y_train)))
print('평가 데이터 점수 : {}'.format(model.score(X_test, y_test)))
metirics 모듈
accuracy_score 함수를 제공from sklearn.datasets import make_classification # 랜덤으로 분류형 데이터 생성
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
X, y = make_classification(
n_samples = 1000, # 생성하는 데이터 개수
n_features = 2, # feature의 개수
n_informative = 2, # 의미 있는 feature의 개수
n_redundant=0, # 노이즈 (0 <- 거의 순수한 데이터?)
n_clusters_per_class=1, # 클래스당 하나의 클러스터만 나오게 하기
)
X
y
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=36)
model = LogisticRegression()
model.fit(X_train, y_train)
model.score(X_train, y_train)
model.score(X_test, y_test)
predict = model.predict(X_test) # 예측값
accuracy_score(y_test, predict)
from sklearn.metrics import confusion_matrix
confmat = confusion_matrix(y_true=y_test, y_pred=predict) # 결과는 2차원 array
print(confmat)
fig, ax = plt.subplots(figsize=(2.5, 2.5))
ax.matshow(confmat, cmap=plt.cm.Blues, alpha=0.3)
for i in range(confmat.shape[0]) :
for j in range(confmat.shape[1]) :
ax.text(x = j, y = i, s=confmat[i,j], va='center', ha='center')
정밀도(Precision) = TP / (FP + TP)
재현율(Recall) = TP / (FN + TP)
정확도(accuracy) = (TN + TP) / (TN + FP + FN + TP)
오류율 = (FN + FP) / (TN + FP + FN + TP)
from sklearn.metrics import precision_score, recall_score
precision = precision_score(y_test, predict)
precision
recall = recall_score(y_test, predict)
recall
\begin{equation}
F1 = 2 \times \frac{precision \times recall}{precision + recall}
\end{equation}
from sklearn.metrics import f1_score
f1_score(y_test, predict)
ROC 곡선은 FPR(False Positive Rate)이 변할 때 TPR(True Positive Rate)이 어떻게 변하는지 나타내는 곡선
AUC(Area Under Curve) 값은 ROC 곡선 밑에 면적을 구한 값 (1이 가까울수록 좋은 값)
from sklearn.metrics import roc_curve
model.predict_proba(X_test)[:10]
pred_proba_class1 = model.predict_proba(X_test)[:, 1]
pred_proba_class1[:10]
fprs, tprs, thresholds = roc_curve(y_test, pred_proba_class1)
plt.plot(fprs, tprs, label='ROC') # 매우 좋은 성능을 나타내고 있다.
plt.xlabel('FPR')
plt.ylabel('TPR(Recall)')
plt.legend()
from sklearn.metrics import roc_auc_score
roc_auc_score(y_test, predict)