【SIGNATE】로지스틱 회귀 모델의 정밀도를 올리자

이 기사는 "【SIGNATE】책의 지식만으로 SIGNATE의 연습 문제에 도전해 보았다"의 속편입니다.

로지스틱 회귀 모델의 정밀도 향상



이전에 게시한 기사 내에서 구현한 로지스틱 회귀 모델의 정밀도를 높이기 위해 여러 가지를 시도했습니다.

표준화



이전 기사 내에서 이미 표준화가 진행되었지만 효과가 있었는지 확인했습니다.

표준화되지 않은 교육 데이터를 사용하여 모델을 교육했습니다.
from sklearn.linear_model import LogisticRegression

lr = LogisticRegression(C=100.0, random_state=1)

# 標準化していないトレーニングデータ(learning_data)を用いてロジスティック回帰クラスを学習する
lr.fit(learning_data_X, learning_data_Y)

이 모델의 정확도는 다음과 같습니다.
# 正解データ(validation_data)を用いて精度を求める
lr.score(validation_data_X, validation_data_Y)


표준화했을 경우의 정밀도가 79.23%이었기 때문에, 0.4% 정도 정밀도가 오르고 있었다
(거의 오차의 범위. 각 특징량의 데이터의 값의 크기에 편차가 없기 때문에, 표준화는 효과적이지 않다고 생각된다)

주성분 분석을 통한 차원 감소



특징량이 6개는 많은 생각이 들었기 때문에, 차원 삭감을 위해 주성분 분석을 실시했다
import numpy as np

# 標準化したトレーニングデータ(learning_data_X_std)を用いて、共起行列を生成する
cov_mat = np.cov(learning_data_X_std.T)

# 固有値・固有ベクトルを計算する
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)

고유치는 다음과 같았다.
# 固有値の値を確認する
eigen_vals


모든 고유 값이 1에 가까운 값이며 차원 축소가 불가능합니다.

커널 주성분 분석



단지 주성분 분석에서는 쓸모 없기 때문에 커널 주성분 분석을 시도했다.
from sklearn.decomposition import KernelPCA

# カーネル主成分分析クラスのインスタンスを生成する
scikit_kpca = KernelPCA(n_components=6, kernel='rbf', gamma=15)

# 標準化したトレーニングデータ(learning_data_X_std)を用いて、カーネル行列を計算する
scikit_kpca.fit(learning_data_X_std)

# トレーニングデータと正解データを変換する
learning_data_X_std_kpca = scikit_kpca.transform(learning_data_X_std)
validation_data_X_std_kpca = scikit_kpca.transform(validation_data_X_std)

커널 행렬을 이용하여 변환된 트레이닝 데이터를 이용하여 로지스틱 회귀 모델을 학습하였다.
from sklearn.linear_model import LogisticRegression

lr = LogisticRegression(C=100.0, random_state=1)

# 標準化+カーネル主成分分析によってデータ変換したトレーニングデータ(learning_data_X_std_kpca)を用いてロジスティック回帰クラスを学習する
lr.fit(learning_data_X_std_kpca, learning_data_Y)

이 모델의 정확도는 다음과 같습니다.
lr.score(validation_data_X_std_kpca, validation_data_Y)


어째서 바보가 되지 않아

매개변수 최적화



표준화+커널 주성분 분석에 의한 데이터 변환을 실시한 결과, 모델의 정밀도가 내려 버렸다
이것은 아마도 입력 파라미터 (표준화의 C, 커널 주성분 분석의 γ)가 부적절하기 때문일 것입니다.

이 2개의 인풋 파라미터를 다양한 변화시킨 결과, C=500, γ=0.1로 정밀도가 83.84%까지 높아지는 것을 알 수 있었다


다른 분류기를 사용해 보았습니다.



로지스틱 회귀의 정확성을 높이기 위해 다른 방법이 있는지 생각하지 못했습니다.
다른 분류기라면 어떻게 될지 시도해 보았습니다.

결정 나무



특징 량이 이산 값이고, 가능한 값의 수가 적기 때문에, 결정 트리를 시험해 보았다
from sklearn.tree import DecisionTreeClassifier

tree = DecisionTreeClassifier(criterion='gini', max_depth=4, random_state=1)

# 標準化していないトレーニングデータを用いて決定木を学習する
tree.fit(learning_data_X, learning_data_Y)

이 모델의 정확도는 다음과 같습니다.
tree.score(validation_data_X, validation_data_Y)


매우 정확합니다.

랜덤 포레스트



결정 나무로 상당히 좋은 정밀도가 나왔기 때문에, 랜덤 포레스트도 시험해 보았다
from sklearn.ensemble import RandomForestClassifier

forest = RandomForestClassifier(criterion='gini', n_estimators=25, random_state=1, n_jobs=2)

# 標準化していないトレーニングデータを用いてランダムフォレストを学習する
forest.fit(learning_data_X, learning_data_Y)

이 모델의 정확도는 다음과 같습니다.
forest.score(validation_data_X, validation_data_Y)





분류기에는 얻기 어려움이 있기 때문에 다양한 분류기로 문제에 접근하는 것이 중요하다는 것을 잘 이해할 수있었습니다.

좋은 웹페이지 즐겨찾기