機械学習ライブラリScikit-learn
前回、機械学習ライブラリScikit-learnの手書き数字のデータセットを使って、自分で作った手書き数字から実際にどの数字なのか予想させてみました。
![](https://3pysci.com/wp-content/uploads/2020/09/python-sklearn45-1.png)
その機械学習モデルとしては「LinearSVC」を使ってきました。
この手書き数字のデータセットに関しては、かなりいい精度で予想してくれて、なかなか良いモデルなのですが、せっかくなら他のモデルも試していこうというのが今回の内容です。
前に機械学習のモデルを検討した際、「LinearSVC」がダメだった場合はこんな感じでした。
![](https://3pysci.com/wp-content/uploads/2020/09/python-sklearn46-1.png)
「Naive Bayes」は文章のようなテキストデータに使うものなので今回のデータセットでは除外。
ということで「KNeighborsClassifier」を試して、ダメなら「SVC」、「EnsembleClassifiers」を試すという流れになります。
「EnsembleClassifiers」はちょっと特殊な機械学習モデルのようなので、今回は「LinearSVC」の元の機械学習モデルである「SVC」と「KNeighborsClassifier」を試してみましょう。
最初はデータの読み込みからです。
<セル1>
from sklearn.datasets import load_digits
digits = load_digits(as_frame=True)
digits.frame
実行結果
![](https://3pysci.com/wp-content/uploads/2020/09/python-sklearn46-2.png)
また比較対象として「LinearSVC」モデルを使った機械学習をやっておきます。
<セル2>
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
x = digits.frame.iloc[:, 0:-1]
y = digits.frame.iloc[:, -1]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8)
model = LinearSVC(max_iter=1000000)
model.fit(x_train, y_train)
pred = model.predict(x_test)
print(accuracy_score(y_test, pred))
実行結果
0.9583333333333334
それでは始めていきましょう。
SVC:Support Vector machine Classifier
SVCは前に使った「LinearSVC」のもとになる機械学習モデルです。
またSupport Vector machine Classifierということで、前にちょっと解説したサポートベクターマシンの分類バージョンであることが分かります。
![](https://3pysci.com/wp-content/uploads/2020/04/python-sklearn3-5-300x169.png)
つまりサポートベクターマシンで分類するモデルが今回のSVCモデルで、その中の分類方法を「Linear」 とすると「LinearSVC」 になるというわけです。
またそのうちにオプションに関しては詳しい解説をしたいと思いますので、今回はとりあえず使ってみましょう。
先ほどの「LinearSVC」のプログラムで「from sklearn.svm import LinearSVC」を「from sklearn.svm import SVC」に変え、「model = LinearSVC(max_iter=1000000)」を「model = SVC()」に変えるだけです。
<セル3>
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
x = digits.frame.iloc[:, 0:-1]
y = digits.frame.iloc[:, -1]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8)
model = SVC()
model.fit(x_train, y_train)
pred = model.predict(x_test)
print(accuracy_score(y_test, pred))
実行結果
0.9888888888888889
こちらもかなり良いスコアが出ました。
ちなみにLinearSVCだと、kernelというオプションが「linear」になるようです。
デフォルトでは「rbf」となっていて、ちょっとだけですがスコアの違いがあるのは、このkernelのオプションからきているかもしれません。
KNeighborsClassifier:K近傍法
「KNeighborsClassifier」は先にでてきたSVCとはまた違う思想の機械学習モデルです。
こちらの場合はある点から近いところにあるデータを同じカテゴリであると認識します。
Qiitaに概念をざっくりと解説している記事があったのでリンクを貼っておきます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUU2JUE5JTlGJUU2JUEyJUIwJUU1JUFEJUE2JUU3JUJGJTkyJTIwJUUzJTgwJTlDJTIwSyVFMiU4OCU5MiVFOCVCRiU5MSVFNSU4MiU4RCVFNiVCMyU5NSUyMCVFMyU4MCU5QyZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9ZmRlYjE2ODFmZWU5MTk3MmU3ODI0YTgwMmU2OTc3MGI&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBmdWppbiZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9M2FhYWExOTYxZmZhYWQ5NzNjNTRmZmY3NTBjNTM2MWE&blend-x=142&blend-y=436&blend-mode=normal&txt64=aW4g5qCq5byP5Lya56S-44Ki44Kk44Ko44Oz44K_44O8&txt-width=770&txt-clip=end%2Cellipsis&txt-color=%23212121&txt-font=Hiragino%20Sans%20W6&txt-size=36&txt-x=156&txt-y=536&s=8b54773ea2e3274d6790592361574f09)
こちらも試してみましょう。
「SVC」の時と同様にインポートするライブラリを変え、モデルの読み込みを変えるだけです。
<セル4>
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
x = digits.frame.iloc[:, 0:-1]
y = digits.frame.iloc[:, -1]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8)
model = KNeighborsClassifier()
model.fit(x_train, y_train)
pred = model.predict(x_test)
print(accuracy_score(y_test, pred))
実行結果
0.9888888888888889
こちらもかなり良いスコアが出ました。
今回のデータセットはかなり優しいデータセットのようで、どのモデルでも良いスコアが出ています。
それでももう少しモデル探索の旅を続けてみることにしましょう。
次回は今回後回しにした「EnsembleClassifiers」を試してみることにしましょう。
![](https://3pysci.com/wp-content/uploads/2020/09/python-sklearn47-2-300x122.png)
ということで今回はこんな感じで。
コメント