kaggleに挑戦 その2 ランダムフォレスト
ランダムフォレストって何?
ランダムフォレストは、複数の決定木を組み合わせて、
各決定木における予想結果の多数決により、結果を得ます。
アルゴリズムとしては、
1.ランダムにn個のデータを抽出、
2.1で取得したデータから決定木を成長、
3.1と2を複数回繰り返す、
4.予想結果を多数決する、
タイタニック号のデータに適用する。
まずは、簡単にするため、
説明変数を"Age"、"Pclass"、"Sex"に絞ろうと思います。
目的変数"Survived"と相関があるか調べます。
#必要なモジュールインポート import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline #データの読み込み titanic_df = pd.read_csv("train.csv") titanic_df.info() sns.factorplot("Pclass","Survived",data = titanic_df_main, hue = "Sex") sns.lmplot('Age','Survived',data=titanic_df)
データの可視化には、seabornというライブラリを使ってます。
factorplot した歳の、データ点は平均値、誤差棒は標準誤差分です。
男性、3等客室は亡くなった方が多いことがわかります。
近似直線を引くと、右肩下がりになっています。
年齢が高い方が、亡くなった方が多いことがわかります。
"Age"、"Pclass"、"Sex"は説明変数として使えそうですね。
続いて、解析する前にデータを整形します。
"Age"には欠損値が多く、そのままではデータ解析できません。
欠損値を中央値で置き換えることにします。
titanic_df_main["Age"].fillna(titanic_df_main["Age"].median(),inplace = True)
続いて、"Sex"をダミー変数に変えます。
dummy = pd.get_dummies(data = titanic_df_main["Sex"],drop_first=True) titanic_df_main = titanic_df_main.combine_first(dummy)
ダミー変数は、オプションとして、「drop_fisrt = True 」とすると第1項を落としてくれます。
説明変数としてダミー変数を使う場合、多重共線性から上記を実施する必要があります。
続いてscikit-learnのランダムフォレストを利用して、実装していきます。
ランダムフォレストを実装
ランダムフォレストの代表的パラメーターとしては、以下3種類です。
1.ランダムに選ぶデータの数
2.説明変数の数(木の深さ)
3.決定木の数
1と2に関しては、デフォルト値を採用します。
尚、1のデフォルト値はデータ数になります。
データは、復元抽出で選ばれるので、すべてのデータが使われるわけではありません。
2のデフォルト値は、説明変数のルートをとったものです。
3はとりあえずn=100とします。
titanic_df_main_random_forest = titanic_df_main.drop(["PassengerId","Sex"],axis = 1 ) train_data = titanic_df_main_random_forest.values x_train = train_data[:,[0,1,3]] y_train = train_data[:,2] from sklearn.ensemble import RandomForestClassifier forest = RandomForestClassifier(criterion = "entropy", n_estimators = 100)
これでランダムフォレストを実装できました。
決定木の数に関しては、当然数が多いと性能はよくなりますが、計算コストが増えます。
これはグリッドサーチにより決めれば良いと思います。
次はグリッドサーチとランダムフォレストの結果について書こうと思います。
kaggleに挑戦 その1 決定木を使う
はじめに
機会学習のスキルを身に付けたく、kaggleに挑戦中です。
タイタニック号のデータを、ランダムフォレストでモデル化しました。
今回は、ランダムフォレストの基本となる決定木について書こうと思います。
簡単に自己紹介すると、僕は材料系メーカーのエンジニアです。
学生時代に統計分析はそこそこ経験していますが、
機会学習は全くの素人でした。
社会人になって、機会学習に興味を持ち、
色々と勉強していくうちにkaggleを知った次第です。
タイタニック号のデータ
初心者向けのコンペとして、
「Titanic:Machine Learning From Disaster 」
があります。
タイタニック号の事故について、
どのような要因(年齢、性別、階級等)が乗客の生死を分けたか?
という物を分析するものです。
初心者は初心者らしく、初心者向けのコンペに挑戦します。
データのダウンロード
まずはkaggleのサイトから、以下二つのデータをダウンロードします。
kaggleのアカウントを持っていない人は、先に作っておきましょう。
上記二つのデータは、それぞれ訓練用(train)データと評価用(test)データです。
訓練用データで、モデルを作成し、評価用データでそのモデルの妥当性を検証します。
「訓練用データでどのようなモデルを作成するか」
これがデータ分析者のキモですね。
モデルを作るときは汎化性能を意識する必要があります。
このあたりが、学生の時にやっていた統計分析と違うのかなーと思っています。
(あくまで個人的な意見です。統計分析という単語も個人的経験を指しています。)
今回はscikit-learnのランダムフォレストを使ってモデルを作成していきます。
ランダムフォレストと決定木分類器
ランダムフォレストってなんぞや?となりますが、
その前に決定木分類器の説明をします。
決定木分類器とは、いくつか質問に基づき決断を下すという分類器。
言葉で書いてもよくわからないと思うので、こちらのHPから下記図を引用させて頂きました。
上図では、性別、年齢等に関する問を組み合わせて生存可否の決断をします。
親nodeから子nodeに分岐するTree構造になっているので、決定木と呼ばれています。
上記図の年齢に関する質問において、10歳を基準に区切っています。
このとき15歳ではダメなのか?5歳ではダメなのか?という疑問を持ちます。
質問の目的は生存、死亡を分岐することなので、一番正確に分岐できる年齢を設定したいですよね。
このモチベーションを定量化するために、「情報エントロピー」「情報利得」を用います。
上記質問で例えると、
10歳以下の人がすべて生存して、それ以外は亡くなったとしたら、情報エントロピーは0となります。
0に近いと正確(理想的)に分岐できていて、1に近いとその質問では全く分岐できていないことになります。
ここで情報利得とは、親nodeと子nodeの情報エントロピーの差です。
子nodeの情報エントロピーが0に近い程(その質問で正確に分岐できている程)、情報利得は大きくなります。
つまり、情報利得が最大になるように質問を設定すれば良いのです。
決定木は、質問が多い程、過学習に陥りやすくなります。
そこでランダムフォレストは、上記対策がなされています。
次回はランダムフォレストについて書こうと思います。
pycharm インストール
学生の時は、Fortran,Cとか使ってた。
流行りだからpythonのスキルを上げたい。
IDEはvisual studioを使ってたけど、
pycharmに乗り換えて(python限定だけど)みる。
visual studioは重い気がして好きになれない・・・。
windows とmac、両方で使えるって理由のみでこれにpycharmを選びました。
インストールしてみる。
インタプリタは、anacondaを使用。
下記サイトからDLできます。
https://www.continuum.io/downloads
ver3.6をインストール。
pycharmを起動すると下記の画面。
「Create New Project」を選択。
次の画面で、Interpreterを選びます。
今回はanacondaを選択。
以上
pythonでexcel,csvファイルを読み込む
まずはエクセルファイル名を取得
以下を参考にしました。
Python: 指定したパスのディレクトリ中のファイル一覧を出力 | Yukun's Blog
import os # osモジュールのインポート # os.listdir('パス') # 指定したパス内の全てのファイルとディレクトリを要素とするリストを返す files = os.listdir('ディレクトリのpath') for file in files: print(file)
ファイル名だけじゃなくて、フルパスを取得した場合は以下、
import glob # パス内の全ての"指定パス+ファイル名"と"指定パス+ディレクトリ名"を要素とするリストを返す files = glob.glob('ディレクトリのpath') # ワイルドカードが使用可能、今回はcsvファイルを取得、 for file in files: print file
excel,csvファイルからデータを取得してデータフレーム化
ファイル名を取得したら、
そこからデータを引っ張って、データフレーム にします。
以下参考、
pandasでcsv/tsvファイル読み込み(read_csv, read_table) | note.nkmk.me
Pandas で CSV ファイルやテキストファイルを読み込む – Python でデータサイエンス
csvファイルのうち、
i行スキップして読み込み、
そこからn行読み込むとします。
j列目のデータだけ取得、
ヘッダーはなし、
尚、globモジュールでパスリストをfileに格納したとします。
import pandas as pd for file in files csv_df = pd.read_csv(file,sep=",",skiprows=i,nrows=n,header=None, usecols=[j]) csv_df_all = pd.concat([csv_df_all,csv_df],axis = 1 )
読み込むファイルがエクセルならば以下、
import pandas as pd for file in files excel_df = pd.read_excel("excelのpath",sheetname= "sheet名を指定",skiprows =飛ばす行数 ,skipcols = 飛ばす列数) excel_df_all = pd.concat([excel_df_all,excel_df],axis = 1)