【Python】機械学習の性能を比較してみた

 

この記事では、どの機械学習アルゴリズムが良いのかデータを使って検証してみました。

 

「機械学習って色々あってどれを使えば良いのかイマイチ分からない」

「そもそもどんなアルゴリズムがあるのか知りたい」

 

そんな方の参考になればと思います。

 

[toc]

 

機械学習アルゴリズムの種類

 

今回、比較してみるアルゴリズムは4つです。どれもscikit-learnに付属しているアルゴリズムです。

 

  • K近傍法
  • ランダムフォレスト
  • LinearSVC(サポートベクターマシン)
  • SVC(サポートベクターマシン)

 

使用するデータ

 

毎回お馴染みのアヤメデータセットを使います。

 

from sklearn.datasets import load_iris

iris_dataset = load_iris()

print(iris_dataset.keys())

print(iris_dataset['target_names'])
print(iris_dataset['feature_names'])

print(iris_dataset['target'].shape)
print(iris_dataset['data'].shape)

 

中身を確認してみます。

 

['setosa' 'versicolor' 'virginica']
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
(150,)
(150, 4)

 

ラベルは3種類で、使用する特徴量は4種類、データ数は150であることが分かりました。

 

from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)

 

評価するためにデータを分類しておきます。

 

各アルゴリズムの実行結果

 

K近傍法

 

for i in range(1,6):
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train,y_train)

    y_pred = knn.predict(X_test)
    print("{}:{}".format(i,accuracy_score(y_test, y_pred)))

 

せっかくなので、Kの数を1~5の範囲で変更してみました。

 

1:0.9736842105263158
2:0.9736842105263158
3:0.9736842105263158
4:0.9736842105263158
5:0.9736842105263158

 

なんと、Kの数に関係なく同じ結果になりました。

 

ランダムフォレスト

 

from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
clf.fit(X_train, y_train)

# 予測して精度を確認する
y_pred = clf.predict(X_test)
print(accuracy_score(y_test, y_pred))

 

0.9736842105263158

 

こちらも同じ結果に。

 

LinearSVC

 

from sklearn import svm,metrics
from sklearn.metrics import accuracy_score

clf = svm.LinearSVC()
clf.fit(X_train, y_train)

# 予測して精度を確認する
y_pred = clf.predict(X_test)
print(accuracy_score(y_test, y_pred))

 

0.9210526315789473

 

少し精度が落ちました。

 

SVC

 

from sklearn.svm import SVC

clf = SVC()
clf.fit(X_train, y_train)
 
y_pred = clf.predict(X_test)
print(accuracy_score(y_test, y_pred))

 

0.9736842105263158

 

こちらは最初の2つと同じ結果でした。

 

まとめ

 

結果的には、K近傍法 = ランダムフォレスト = SVC > Linear SVCでした。

 

結構違いが出るのかと思ったのですが、あまり変わらない結果となってしまいました。

 

データ数が少なく、分類しやすいからかもしれません。

 

以上です。お疲れ様でした。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog