この記事では、どの機械学習アルゴリズムが良いのかデータを使って検証してみました。
「機械学習って色々あってどれを使えば良いのかイマイチ分からない」
「そもそもどんなアルゴリズムがあるのか知りたい」
そんな方の参考になればと思います。
目次
機械学習アルゴリズムの種類
今回、比較してみるアルゴリズムは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でした。
結構違いが出るのかと思ったのですが、あまり変わらない結果となってしまいました。
データ数が少なく、分類しやすいからかもしれません。
以上です。お疲れ様でした。