カニゲーム攻略日記ブログ

beatmaniaIIDXやハースストーンなどのゲーム攻略日記。主にまったり勢。2016年にIIDX皆伝になった

kaggle expert を目指す 2 タイタニック号攻略 決定木をちょっとやった

kaggleはゲームだね

決定木 (Decision Tree)という技をちょっと使ってみた

ついでに改善結果の良し悪し(accuracy)のやり方も

contents

Titanic

Titanic問題の種類?

"Titanic - Machine Learning from Disaster"の問題は、二値分類問題 (Binary Classification Problem) として知られています。つまり、目標は乗客が生存したかどうかを予測することで、生存した場合は1、そうでない場合は0という2つのクラス(またはカテゴリ)のうちの1つを予測することです。

機械学習の問題は様々な種類がありますが、その中で一般的によく見られるものは以下の通りです:

  1. 二値分類 (Binary Classification): あるデータポイントが2つの可能なクラスのうちどちらに属するかを予測します。例えば、スパムメールフィルター(メールがスパムかどうか)やクレジットカード詐欺検出(取引が詐欺かどうか)など。

  2. 多クラス分類 (Multiclass Classification): データポイントが3つ以上のクラスのうちどれに属するかを予測します。例えば、手書き数字の認識(0から9までの10クラス)や新聞記事のトピック分類(政治、スポーツ、エンターテイメントなどの多くのカテゴリ)など。

  3. 多ラベル分類 (Multilabel Classification): 各データポイントに複数のラベルが割り当てられる場合の予測です。例えば、映画に対するタグ付け(コメディ、ロマンス、アクションなど、1つの映画に複数のタグが付けられる)など。

  4. 回帰 (Regression): 数値の出力を予測します。これは一般に連続的な数量を予測するのに使われます。例えば、家の価格の予測(価格は任意の値を取る可能性がある)や株価の予測など。

  5. クラスタリング (Clustering): データポイントのグループまたはクラスタを識別しますが、これは教師なし学習の一例です(つまり、正解ラベルが与えられていません)。顧客のセグメンテーションやニュース記事のトピック識別などに使われます。

これらは機械学習の問題の一部であり、他にも多くの種類が存在します。適切な問題の種類は、解決しよ

二値分類 (Binary Classification)問題の有効な解法

二値分類 (Binary Classification)は、ある質問に対して「はい」または「いいえ」の答えを見つけるための機械学習のタイプです。例えば、「このメールはスパムですか?」、「この画像に猫はいますか?」といった質問がそれに当たります。

解法1: ロジスティック回帰 (Logistic Regression) ロジスティック回帰は二値分類問題によく使われる方法です。この方法は、質問に対する答えが「はい」の確率を0から1の間で出す方法です。ロジスティック回帰は、答えが「はい」である可能性を数学的に計算します。

イメージしやすい説明:ロジスティック回帰は、それぞれの人が「すき焼き派」か「しゃぶしゃぶ派」かを予測するための手法だと考えてみてください。その人が男性か女性か、年齢、好きな食べ物、などの情報から、「すき焼き派」か「しゃぶしゃぶ派」かを予測します。

解法2: 決定木 (Decision Tree) 決定木は質問をたくさん立てて答えを見つける方法です。それぞれの質問は「はい」か「いいえ」の答えになり、それによって次の質問に進みます。最終的に答えを見つけるまで質問を続けます。

イメージしやすい説明:決定木は、20問あてゲームのようなものです。例えば、「それは生きていますか?」「それは飛びますか?」など、はい/いいえの質問を続けて、最終的にそれが何かを当てるゲームです。同じように、決定木は一連のはい/いいえの質問を使って、「これはスパムメールですか?」といった問いに答えを出します。

決定木 (Decision Tree)の例

レベル1: まずはPythonについて知ることから始めましょう。Pythonはデータ分析や機械学習によく使われるプログラミング言語です。以下のコードはPythonの基本的な出力方法です。以下のコードを書いて、実行してみましょう。

print("Hello, World!")

レベル2: 次に、Pythonでデータを扱うためのツールを使ってみましょう。pandasというライブラリは、データの読み込みや整形によく使われます。以下のコードは、pandasを使ってデータを読み込む基本的な方法です。

import pandas as pd

data = pd.read_csv('your_file.csv')  # your_file.csvを自分が読み込みたいデータのファイル名に変更
print(data.head())

レベル3: さて、次に機械学習の一部を学びましょう。決定木というアルゴリズムを使ってみます。以下のコードは、決定木を使ってデータを学習する基本的な方法です。

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier()
model.fit(X_train, Y_train)

レベル4: 決定木は、一つの木で学習するのではなく、たくさんの木を組み合わせて学習するランダムフォレストという手法もあります。これは決定木を強化したもので、より精度の高い予測ができます。以下のコードはランダムフォレストを使ってモデルを学習する方法です。

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=10)
model.fit(X_train, Y_train)

レベル5: 最終的には、ランダムフォレストのパラメータを調整することで、さらに精度を上げることができます。パラメータを調整することは機械学習における重要なスキルです。

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X_train, Y_train)

これらのステップを通じて、Python機械学習の基本を学び、最終的には高度な技術を使えるようになることが目標です。

改善結果の良し悪し

はい、実際にモデルの改善結果が良いのか悪いのかを判断する方法があります。それは「評価」または「テスト」です。これにはいくつかの手法がありますが、最も基本的な方法は「訓練データ」と「テストデータ」を分けることです。

具体的には、手元にあるデータを二つのグループに分けます。一つは「訓練データ」で、これを使ってモデルを訓練(学習)します。もう一つは「テストデータ」で、これを使ってモデルがどれだけ正確に予測できるかを評価します。

この方法の良い点は、モデルが新しい、見たことのないデータに対してどれだけ良い予測をするかを確認できることです。なぜなら、テストデータは訓練プロセス中にはモデルが見たことがないデータだからです。

Pythonでは以下のようにして訓練データとテストデータを分け、モデルの評価を行うことができます。

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# データを訓練データとテストデータに分ける
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=1)

# モデルの訓練
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X_train, Y_train)

# テストデータでの予測
predictions = model.predict(X_test)

# 予測結果の評価(精度を計算)
accuracy = accuracy_score(Y_test, predictions)

print("Accuracy: ", accuracy)

このコードでは、「accuracy_score」を使ってモデルの精度を計算しています。精度は、モデルが正しく予測できたデータの割合を表しています。つまり、精度が1.0(または100%)であれば、モデルの予測は全て正確であるということです。

train_test_split

ええとね、これはちょっと大きなパズルゲームを想像してみてね。全部のピースが揃っているパズルの箱があるとするね。でも、その全部のピースを使ってパズルを組み立てたら、それがうまくできたかどうかを確認する新たなピースがもうないよね。

だから、パズルのピースを2つのグループに分けてみることにするよ。1つのグループは「訓練データ」で、これを使ってパズルをどう組み立てるか学習するんだ。もう1つのグループは「テストデータ」で、これを使って自分が学んだことでパズルをうまく組み立てられるかを確認するんだよ。

このコードでは、手元にある全てのデータ(全部のパズルピース)を、8割を訓練データ(パズルを組み立てるためのピース)、2割をテストデータ(組み立てたパズルを確認するためのピース)に分けているんだよ。それがこの行の意味だよ。

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=1)

この方法を使うと、学んだことを確認する新しいピースがいつでも手元にあるから、学習がうまく進んでいるかどうかを確認できるんだよ。だから、これはとっても重要なステップなんだ!

XY?

いい質問だね!

「X」と「Y」は、私たちが予測問題を解くときによく使う記号だよ。「X」は特徴(Features)を、「Y」は目標(Target)を表しているんだ。

「特徴」は、予測をするために使う情報のことだよ。例えば、タイタニック号の問題で言えば、「Pclass」(チケットのクラス)、「Sex」(性別)、「SibSp」(乗船していた兄弟や配偶者の数)、「Parch」(乗船していた親や子供の数)などが特徴になるね。

一方、「目標」は、予測したいもののことだよ。タイタニック号の問題で言えば、「Survived」(生存したかどうか)が目標になるね。

だから、このコードの「X」と「Y」は、タイタニック号の問題の場合、

  • X:「Pclass」、「Sex」、「SibSp」、「Parch」のような特徴
  • Y:「Survived」(生存したかどうか)

となるんだ。そして、これらを訓練データとテストデータに分けることで、機械学習モデルを訓練し、そのモデルがうまく機能しているかを確認できるんだよ。

もうちょい詳しく

大丈夫、一緒にやってみよう!

まず、タイタニック号のデータセットから特徴量(Features)と目標変数(Target)を設定する必要があるよ。

「train_data」というのは訓練データを含んでいて、それを使って機械学習モデルを訓練するんだ。「test_data」はその訓練されたモデルをテストするためのデータなんだ。

今回の問題では、「Pclass」、「Sex」、「SibSp」、「Parch」を特徴量(つまり、X)とし、「Survived」を目標変数(つまり、Y)として設定するね。

# 特徴量と目標変数を設定
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = pd.get_dummies(train_data[features])
Y = train_data["Survived"]

ここで「pd.get_dummies」は、カテゴリ変数(この場合は「Sex」)を数値に変換するために使っているよ。つまり、'male'と'female'を0と1のような数値に変えてくれるんだ。

そして、次のステップは「train_test_split」を使って、この「X」と「Y」を訓練データとテストデータに分割することだよ。

from sklearn.model_selection import train_test_split

# データを訓練データとテストデータに分ける
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=1)

これで、「X_train」、「X_test」、「Y_train」、「Y_test」が得られるよ。これらはそれぞれ訓練用の特徴量、テスト用の特徴量、訓練用の目標変数、テスト用の目標変数を表しているんだ。

なぜこれで正確差が分かる?

もちろんだよ!

君が宿題をやった後、先生がそれをチェックしてくれて、何問正解したかを教えてくれるよね?それと同じことを、「accuracy_score」はコンピュータにやらせているんだ。

この場合、我々の"宿題"は「Y_test」で、これはテストデータの真の結果(つまり、タイタニック号の乗客が本当に生き残ったかどうか)を表しているんだ。そして、「predictions」は我々の予測結果、つまり機械学習モデルが予測した生存結果だよ。

「accuracy_score」は、これら2つを比較して、どれだけ予測が正確だったかを計算するんだ。具体的には、「predictions」が「Y_test」にどれだけ近いか(つまり、どれだけ正確に乗客が生き残るかを予測できたか)をパーセンテージで示すよ。

このパーセンテージが高ければ高いほど、予測が正確だったと言えるんだ。つまり、我々の"宿題"の答えが、先生(つまり、真の結果)の答えにどれだけ近いかを見ているというわけさ。