Saki0506
@Saki0506 (さき おぐら)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonの機械学習のソースコードを理解したいです

Q&A

Closed

解決したいこと

pythonの機械学習のソースコードを理解したいです
本を読んで機械学習の勉強をしているのですが、どうしても分からない部分があるので質問させていただきました。
参考Git
https://github.com/kujirahand/book-mlearn-gyomu/tree/master/src/ch2/wine

該当するソースコード

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier 
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report


# データを読み込む --- (*1)
wine = pd.read_csv("winequality-white.csv", sep=";", encoding="utf-8")
# データをラベルとデータに分離
y = wine["quality"]
x = wine.drop("quality", axis=1)

print(y)


# yのラベルをつけ直す --- (*2)
# newlist = []
# for v in list(y):
#     if v <= 4:
#         newlist += [0]
#     elif v <= 7:
#         newlist += [1]
#     else:
#         newlist += [2]
# y = newlist

# print(newlist)

# 学習用とテスト用に分割する --- (*3)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)


# 学習する --- (*4)
model = RandomForestClassifier()
model.fit(x_train, y_train)


# 評価する --- (*5)
y_pred = model.predict(x_test)
print(classification_report(y_test, y_pred))
print("正解率=", accuracy_score(y_test, y_pred))

質問1
「コメントアウトしているyのラベルをつけ直す --- (*2)を実行すると、正解率が上がるのですがなぜでしょうか?変更後は0, 1, 2の三種類に分けているのはわかるのですが、なぜQualityの種類が多いと正解率が格段に下がってしますのかを理解できていません」

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

質問2
「上記のコードで4つの変数をどのように分類しているかがいまいち理解できません。この書き方をすればテスト用のx, yを20パーセント分けられて残りの80%は自動的にトレーニング用のx, yに分類される理解であっていますか?train_size=0.8は省略されているだけでしょうか?」

よろしくお願いします。

1

2Answer

質問1

なぜQualityの種類が多いと正解率が格段に下がってしまうのか

まずは、単純に問題の難しさが上がります。yのラベルをつけ直す前は7種類(3〜9)に対し、つけ直した後は3種類です。(機械学習を抜きにして)7択の問題と3択の問題とでは、どちらが正解しやすいでしょうか?

もちろん、より難しい7択の問題であっても、適切な機械学習モデルや訓練データがあれば、3択の場合に匹敵する正解率が達成できる可能性はあります。本件はそうではなかった、と言えるのではないでしょうか。

質問2

理解はあっています。リファレンス (sklearn.model_selection.train_test_split — scikit-learn 0.24.2 documentation) を読むと、以下の記述があります。

test_size : float or int, default=None
If float, should be between 0.0 and 1.0 and represent the proportion of the dataset >to include in the test split.

train_size : float or int, default=None
If None, the value is automatically set to the complement of the test size.

0Like

Comments

  1. @Saki0506

    Questioner

    わかりやすい説明ありがとうございます。

質問1

まずはそのデータセットの中に目的変数のラベル数がどのくらいの量あるのかを確認してみてください。
みたところ、大半は5から7に集中していて非常に少ないラベルがあり、1、2、10は存在すらしないことがわかります。

こういったデータを「不均衡データ」と呼びます。不均衡データはover fittingしやすく、精度が上がらないことが多いです。データ数が比較的均質でそれなりの量がある場合は、3択だろうが7択だろうがあまり関係ありません。

不均衡データへの対応は様々ですが、今回は「新たな目的変数」としてラベルを付け直しています。そうすることで不均衡を軽減し、over fittingを抑制しています。今回は「4以下」「5-7」「8以上」を新しいラベルとして精度が向上していますが、その順番には意味があり(数字が増えれば品質がいい)、4以下や5-7、8以上のものたちは似ている可能性があるためそのようなラベルの付け方をしているんだと思います。

つまり、新しくつけたラベルは以下のような意味を持つんじゃないでしょうか?
0:品質が悪いワイン
1:普通のワイン
2:品質が高いワイン

類似した特徴量を持つ7択問題よりも随分シンプルな分類問題になりましたね。
また、ラベル間でそれぞれが類似する特徴量を使って分類するような難しいタスクではなくなったため、効率よく学習ができるようになったんではないでしょうか?

質問2

その理解で問題ないと思います。

0Like

Comments

  1. @Saki0506

    Questioner

    わかりやすい説明ありがとうございます。

Your answer might help someone💌