機械学習 - 讓訓練/テスト

モデルの評価

機械学習では、私たちは特定のイベントの結果を予測するためのモデルを作成します。例えば、前章で重さとエンジン排気量を理解したとき、車の二酸化炭素排出量を予測しました。

モデルが十分に良いかどうかを測るために、トレーニング/テストと呼ばれる方法を使用できます。

トレーニング/テストとは何か

トレーニング/テストはモデルの精度を測定する方法の一つです。

トレーニング/テストと呼ばれるのは、データセットをトレーニングセットとテストセットに二つのグループに分けるからです。

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()

結果:

テストセットも元のデータセットと似ています:


インスタンスを実行

データセットのフィット

データセットはどのようなものですか?私は最も適切なフィットと考えるのはポリノミアル回帰ですので、ポリノミアル回帰線を描画しましょう。

データポイントに線を引くために、matplotlibモジュールを使用します。 plott() 方法:

インスタンス

データポイントを通るポリノミアル回帰線を描画します:

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スコアはどうでしょうか?R-squared scoreは、私のデータセットがモデルにどれだけフィットしているかをよく示しています。

R2

R2、またはR平方(R-squared)を覚えていますか?

これはx軸とy軸の関係を測定し、0から1の範囲で値を取ります。0は関係がないことを示し、1は完全に関連していることを示します。

sklearnモジュールには、 rs_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は、関係が良いことを示しています。

テストセットの導入

現在、少なくともトレーニングデータの面では、非常に良いモデルを構築しました。

それでは、モデルが同じ結果を返すかどうかを確認するために、テストデータを使用してモデルをテストする必要があります。

インスタンス

テストデータを使用して 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 ドルを消費したと予測され、グラフに対応しています: