(1).やったこと
データサイエンス入門完全攻略
④.データの加工・前処理
(d).データの補完
・カテゴリ変数の数値返還
カテゴリ変数とは、数値で表せる変数ではなくラベルで表せる
データ。
機械学習は数値データを計算するものなので、数値でしか扱えないから、
数値に変換する必要がある。
カテゴリ変数の数値返還には2つ方法がある。
(ア).ワンホットエンコーディング
各カテゴリーに対応する別のカラムを用意し、
該当する=1、該当しない=0、に振り分ける方法
要は、例えば3種あるなら、3つのカラムを用意して、そこに0と1で
表現する数値変換
(イ).ラベルエンコーディング
各カテゴリーを数字に振り分ける方法
基本的には男女みたいなラベルが2つのどちらかのものに使う。
今回はワンホットエンコーディングを使う。
・Enbarkedをワンホットエンコーディングする。
Pandasのget_dummies()でできる。
コードは下記
――――
ohe_embarked = pd.get_dummies(df4["Embarked"], prefix="Embarked")
ohe_embarked.head()
――――
これに加えて、prefixも使い、カラムの接頭語を設定することでわかり
やすくする。
後は、このデータフレームを元のデータフレームと結合する。
使うのはPandasのconcat()
コードは下記
――――
df5 = pd.concat([df4, ohe_embarked], axis=1)
df5.head()
――――
axisは、縦連結されないように入力している。(横連結のためのコード?)
headはきちんと連結されているかの確認。
これで、Embarkedについて数値変換したカラムはできたので、元のカラム
は削除する。
データフレームからカラムを削除する時は.drop
コードは下記
――――
df6 = df5.drop(columns=["Embarked"])
df6.head()
――――
・Sexをラベルエンコーディングする。
今回は男か女かで、0と1だけで表現できるため、わざわざ別のカラムを設
ける必要がない。
(一つのカラム内ですべて表現できる)
コードは下記
―――――
df6["Sex"] = pd.get_dummies(df6["Sex"], drop_first=True)
―――――
drop_firstは作ったカラムのうち、一つ目のカラムを削除ってコード。
・データセットの作成
機械学習モデルを作成するための準備
機械学習モデルを作成する時は
(ア).学習データ(機械学習モデル作成用)
(イ).テストデータ(予測対象)
の2種類のデータが必要。
今回は、trainとtestデータを用意されているが、本来は自分たちで学習
データとテストデータを決める。
まず、これまでいろいろ加工してきたdfは、学習データとテストデータを
連結したデータなので、これをもとのように学習データとテストデータに分
割する。
・学習データとテストデータに分割
学習データとテストデータを見分ける必要がある。
今回は、学習データにはSurvivedが入力されている。テストデータには
Survivedが欠損しているという違いを使ってデータを分ける。
コードは下記
――――
#学習データとテストデータに分割
train = df6[~df6["Survived"].isnull()]
test = df6[df6["Survived"].isnull()]
#df6が空でない時は変数trainへ
#df6が空の時は変数testへ というコードになってる。
――――
~df6["Survived"].isnull()
これで、df6の中で、survivedが空でないこと、を表現できる。
また、このタイミングでtestのSurvivedのカラムは要らなくなるので、
削除する。(.drop)
・学習データを説明変数と目的変数に分割
目的変数は予測したいデータ
説明変数は予測に使うデータ
コードは下記
――――
#学習データを説明変数と目的変数に分割する。
y_train = train["Survived"]
X_train = train.drop(columns=["Survived", "PassengerId"])
print("元のdf", train.shape)
print("説明変数", X_train.shape)
print("目的変数", y_train.shape)
#trainの中からSuevivedをdropで消してるのは、それが説明変数だから、
あると予測がおかしくなるため
――――
(疑)なんで、カラムが1だと、数字が表示されないんだろう?
これで、データ前処理は完了。
⑤.モデルの作成
機械学習には、いろいろな予測するためのモデルがある。
だから、どんなモデルを作るのかも大事な検討項目の一つ。
ただ、今回は実装が簡単で、イメージがしやすい、決定木を使う。
・決定木とは?
条件分岐を繰り返すことで予測する機械学習モデル。
性別は→年齢は→質問1→質問2→……みたいな感じに。(ピラミッド型にてっ
ぺんから分岐していく図をイメージすると良い)
実際の分岐はアルゴリズムでもっと細かく設定される。
#ここら辺は、統計学でやった機械学習のイメージとは違うな。
・決定木を使う準備(scikit-learnから決定木のクラスをインポートする)
コードは下記
――――
from sklearn.tree import DecisionTreeClassifier
――――
DecisionTree:決定木
Classifier:分類
・(余談)機械学習には分類と回帰2つの違いがある。
分類:ラベルを予測する問題が該当
回帰:数値を予測
・モデルのインスタンスを作成する。
コードは下記
――――
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)
――――
モデルを使うこと自体は数行のコードで事足りてしまう。
だから機械学習モデルの作成ってのは結構簡単。
大変なのは、前段階のデータの準備
・決定木のパラメータを設定する。
決定木では、パラメータを設定することで、どれくらい深く条件分岐するか設
定できる。
random stateを42に設定すると、乱数を固定値にできる。
誰でも必ず同じ結果になる。
※ちなみに、機械学習にかかる時間はデータ量に比例する。
これで機械学習モデルの作成は完了。
⑥.モデルの評価
モデルの評価は基本3ステップ
STEP1 学習データを学習用と評価用に分割
STEP2 分割後の学習用データだけ使ってモデルを作成
STEP3 分割後の評価用のデータを使ってモデルを作成
つまり、X_train,y_trainを学習用と評価用に分割しなければならない。
・X_train,y_trainを学習用と評価用に分割
scikit-learnの中に入っているtrain_test_splitを使う。
コードは下記
―――――
#ここからモデルの評価
#まず、学習用と評価用にX_train, y_trainを分割。
from sklearn.model_selection import train_test_split
x_tr,x_va,y_tr,y_va = train_test_split(X_train, y_train, test_size=0.2, random_state=42)
#from sklearn.model_selection import train_test_split は、まず分けるためのものをインポートしてる?
#test_sizeで評価データをどれくらいの割合にするのかを決めている。今回は20%を評価用のデータに割り当てる)
―――――
trは評価用
vaは評価用
これで分割は完了
・ちゃんと分割できたかを確認
コードは下記
――――
print("学習用:", x_tr.shape, y_tr.shape)
print("評価用:", x_va.shape, y_va.shape)
――――
これで表示された数で、ちゃんと分割できてるのがわかる。
・目的変数の内訳をみる。
.value_counts()メソッドを使う。
これで、それぞれのラベルが何件ずつ存在するか確認できる。
そうすると、学習用データと評価用データで、目的変数(Survived)に
含まれる0と1の割合が 違うことに気が付く。
正確にモデルを評価するには、0と1の割合を統一した方が良い。
・目的変数の0と1の割合を統一する。
train_test_splitの引数で層化を意味するstratifyを設定する。
これで、同じ割合になる。
この評価方法をホールドアウトという。
これでSTEP1が完了。
・精度を上げたモデルを作成する。
さっき作ったモデルのmodel.fitをx_tr, y_trに変えてあげるだけ。
コードとしては下記
――――
model = DecisionTreeClassifier(random_state=42)
model.fit(x_tr, y_tr)
――――
・どうすればモデルの精度を評価できるのか?
機械学習が出した予測値と正解を比較する。
つまり、先に機械学習モデルの予測値を計算しておく必要がある。
・モデルの予測値の確認
model.predict()で確認できる。
コードとしては下記
――――
#モデルの予測値を確認する。
y_tr_prred = model.predict(x_tr)
y_va_pred = model.predict(x_va)
――――
x_trの予測値も計算する理由は、あとで精度を確認するときに学習用
データと評価用データにどれくらいの乖離があるのかを確認するため
(今はとりあえずこうすると覚えておく、でもよし)
そして、実際に予測がどうなったか、先頭5つだけをとりあえず確認す
ると、学習データの3番目は、正解データと比べて予測が外れていること
がわかる。
つまり、正解率は80%
では、データ全体としてはどうなのかを確認する。
――――
from sklearn.metrics import accuracy_score
――――
accuracy_scoreはたった1行のコードでモデルの正解率を計算できる。
そして、次に正解率の計算をする。
コードは下記
――――
accuracy_tr = accuracy_score(y_tr, y_tr_pred)
accuracy_va = accuracy_score(y_va, y_va_pred)
――――
そしてこの後確認をする。
コードは下記
――――
print("学習用:", accuracy_tr)
print("評価用:", accuracy_va)
――――
学習用は約90%、評価用は約79%
そして、一般的にモデルの精度を見るときは、評価用のデータを確認。
基本的にはこのスコアが改善されるようにデータを加工したり、特徴量
を追加する。
・テストデータに対して正しく予測できるか確認する。
タイタニックコンペでは、指定されたフォーマットでファイルを作成し、
kaggleのサイト上にアップロードすることになる。
・テストデータを学習用・評価用データに形式を合わせる。
PassengerIdを削除してたので、テストデータも合わせる。
コードは下記
――――
x_test = test.drop(columns=["PassengerId"])
――――
・テストデータをモデルに投入
――――
y_test_pred = model.predict(x_test)
――――
これで計算が始まる。
確認すると、予測がされたことがわかる。
・Kaggle提出用ファイルを作成。
まず、提出用のデータに変換する。
コードは下記
――――
submit_df = test[["PassengerId", "Survived"]].set_index("PassengerId")
――――
次に、Survivedを整数表記に変換
――――
submit_df["Survived"] = submit_df["Survived"].astype(int)
――――
Kaggleに提出するためのcsvファイルを作成
――――
submit_df.to_csv("submission.csv")
――――
kaggleに提出するまで正解率はわからない。
とりあえずKaggleにデータを提出する。
⑦.レポーティング・アプリケーション化
データを改善してビジネスに活用すること。
ビジネスに生かす提案をするとか、アプリに機械学習を組み込むとか。
(2).気づいたこと・学んだこと・疑問
・半角スペースとアンダーバーは、テキスト上での説明が似ているので、読みとりを
間違えやすい。注意。(気づき)
・学習用データ、評価用データ、テストデータの関係性がちょっとあやふや。
後によく深堀すること(疑問)
・エラーメッセージを覚えられると、動かない時に修正が早くなりそう。(気づき)
(3).簡単な復習
・ダミー変数
動画内で言ってたカテゴリ変数の数値変換は、統計学のダミー変数と恐らくリンク
するので、ここで復習する。
質的変数(数字では表しにくいデータ)を、予測するための要素として説明変数として
モデルに盛り込むために、1や0などの数字を割り振った変数。
モデルの中で、カテゴリの差などが数値としての差として現れるように設定される。
現時点ではわかりにくいが、0として設定したものが基準となり、ほかの割り振った数
字の時はそれに対応する差分が反映されるように、モデルの計算が行われる。