機械学習-トレーニング/テスト
モデルを評価する
機械学習では、重量とエンジンサイズがわかっているときに自動車のCO2排出量を予測した前の章のように、特定のイベントの結果を予測するモデルを作成します。
モデルが十分に優れているかどうかを測定するために、Train / Testと呼ばれる方法を使用できます。
トレイン/テストとは
トレーニング/テストは、モデルの精度を測定する方法です。
データセットをトレーニングセットとテストセットの2つのセットに分割するため、トレーニング/テストと呼ばれます。
トレーニング用に80%、テスト用に20%。
トレーニングセットを使用してモデルをトレーニングします。
テストセットを使用してモデルをテストします。
モデルのトレーニングとは、モデルを作成することを意味します。
モデルのテストとは、モデルの精度をテストすることを意味します。
データセットから始める
テストするデータセットから始めます。
私たちのデータセットは、ショップにいる100人の顧客とその買い物習慣を示しています。
例
import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40,
100) / x
plt.scatter(x, y)
plt.show()
結果:
x軸は、購入するまでの分数を表します。
y軸は、購入に費やされた金額を表します。
トレイン/テストに分割
トレーニングセットは、元のデータの80%をランダムに選択する必要があります。
テストセットは残りの20%である必要があります。
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
トレーニングセットを表示する
トレーニングセットで同じ散布図を表示します。
例
plt.scatter(train_x,
train_y)
plt.show()
結果:
元のデータセットのように見えるので、公正な選択のようです。
テストセットを表示する
テストセットが完全に異なっていないことを確認するために、テストセットも調べます。
例
plt.scatter(test_x,
test_y)
plt.show()
結果:
テストセットも元のデータセットのように見えます。
データセットを適合させる
データセットはどのように見えますか?私の意見では、最適なのは多項式回帰だと思うので、多項式回帰の線を引きましょう。
データポイントを通る線を引くに
plot()
は、matplotlibモジュールのメソッドを使用します。
例
データポイントを通る多項式回帰直線を描画します。
import numpy
import
matplotlib.pyplot as plt
numpy.random.seed(2)
x =
numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y =
y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
myline = numpy.linspace(0, 6, 100)
plt.scatter(train_x, train_y)
plt.plot(myline, mymodel(myline))
plt.show()
結果:
この結果は、データセットの外部の値を予測しようとすると奇妙な結果が得られる場合でも、多項式回帰に適合するデータセットの提案を裏付けることができます。例:この行は、店で6分間過ごした顧客が、200相当の購入を行うことを示しています。これは、おそらく過剰適合の兆候です。
しかし、決定係数スコアはどうですか?R-squaredスコアは、私のデータセットがモデルにどの程度適合しているかを示す良い指標です。
R2
R-squaredとしても知られているR2を覚えていますか?
x軸とy軸の関係を測定し、値の範囲は0〜1です。ここで、0は関係がないことを意味し、1は完全に関連していることを意味します。
sklearnモジュールには、r2_score()
この関係を見つけるのに役立つと呼ばれるメソッドがあります。
この場合、顧客が店に滞在する時間と彼らが費やす金額との関係を測定したいと思います。
例
トレーニングデータは多項式回帰にどの程度適合しますか?
import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40,
100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y,
4))
r2 = r2_score(train_y, mymodel(train_x))
print(r2)
注: 結果0.799は、OKの関係があることを示しています。
テストセットを持ち込む
これで、少なくともトレーニングデータに関しては、問題のないモデルが作成されました。
次に、テストデータを使用してモデルをテストし、同じ結果が得られるかどうかを確認します。
例
テストデータを使用するときのR2スコアを見つけましょう。
import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40,
100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y,
4))
r2 = r2_score(test_y, mymodel(test_x))
print(r2)
注: 結果0.809は、モデルがテストセットにも適合していることを示しており、モデルを使用して将来の値を予測できると確信しています。
値を予測する
モデルに問題がないことを確認したので、新しい値の予測を開始できます。
例
購入した顧客が5分間店に滞在した場合、どのくらいのお金を使いますか?
print(mymodel(5))
この例では、図に対応しているように、顧客が22.88ドルを費やすと予測しました。