今回の目的
SIGNATEのPractice,ワインの品種の予測を行う.
本題
用いた学習アルゴリズム
- SVC
- LogisticRegression(ロジスティック回帰)
-
RandomForest
(ランダムフォレスト)
3つのアルゴリズムを試した結果, ランダムフォレストが一番精度が高くなったため, 最終的な分類器として採用した.
コード
データの読み込み
wine-learning.py
wine_data = pd.read_csv('train.tsv',sep='\t')
wine_test = pd.read_csv('test.tsv',sep='\t')
前回はread_table
を用いたが, せっかくなのでread_csv
も使ってみた. tableのほうが楽な気がします.
ちなみに, どちらも呼び出すメソッドは同じっぽいのでどちらが正しいとかはない.
特徴量データと教師データの分離
wine-learning.py
X = wine_data.loc[:,['Alcohol','Malic acid','Ash','Alcalinity of ash','Magnesium','Total phenols','Flavanoids','Nonflavanoid ohenols','Proanthocyanins','Color intensity','Hue','OD280/OD315 of diluted wines','Proline']].values
y = wine_data.loc[:,'Y'].values
変数が多いと長くなりがちだからこれをどうにかしたい. 次の課題をやるときに改善できる方法があるか検討してみる.
ちなみにここでテストデータもやっとく
wine-learning.py
Xt = wine_test.loc[:,['Alcohol','Malic acid','Ash','Alcalinity of ash','Magnesium','Total phenols','Flavanoids','Nonflavanoid ohenols','Proanthocyanins','Color intensity','Hue','OD280/OD315 of diluted wines','Proline']].values
学習データとテストデータに分割
wine-learning.py
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2)
今回もデータを8:2の割合で分割して行った.
欠損値の削除
wine-learning.py
X_train = X_train[:, ~np.isnan(X_train).any(axis=0)]
X_test = X_test[:, ~np.isnan(X_test).any(axis=0)]
Xt = Xt[:, ~np.isnan(Xt).any(axis=0)]
分割前まではなかった欠損値が突然現れた. 原因がわからなかったので,そのうち検証してみようと思う.
今回は欠損値を削除する方針にした.
モデルの学習
SVC
wine-learning.py
clf = svm.SVC()
clf.fit(X_train, y_train)
ロジスティック回帰
wine-learning.py
clf = LogisticRegression()
clf.fit(X_train, y_train)
ランダムフォレスト
wine-learning.py
clf = RandomForestClassifier(n_estimators=500, random_state=0)
clf.fit(X_train, y_train)
random_stateは0,n_estimators(決定木の個数)は多めに500を設定した.
モデルの評価
wine-learning.py
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print('正解率 = ' , accuracy)
例のごとく, accuracy
関数を用いて正解率を出した。
SVCの正解率
正解率 = 0.6111111111111112
ロジスティック回帰の正解率
正解率 = 0.8888888888888888
ランダムフォレストの正解率
正解率 = 1.0
分類
wine-learning.py
X_pred = np.array(Xt)
y_pred = clf.predict(X_pred)
print(y_pred)
結果
やりました(パチパチ)
検討事項
- 変数の量によって学習アルゴリズムを変える.
- 変数の数を落とす(次元削除)作業を行ってから学習アルゴリズムを適用する.
- そもそものアルゴリズムの特性を理解する.
- データ分割の時点で発生した欠損値の原因追及
- 混合行列の採用