一から始める機械学習(Kaggleで学ぶ機械学習)_ Machine learning to learn at Kaggle

Jul 2, 2019 | Publisher: tflare | Category: Technology & Engineering |   | Views: 239 | Likes: 1

一から始める機械学習 (Kaggleで学ぶ機械学習) 阿部 泰之 twitter:@taki_tflare このスライドの対象読者、目的 対象読者  ・機械学習の概要がわかっている方   ・もしくは一から始める機械学習(機械学習概要)を読んだ方が対象 です 目的  ・Kaggleについて理解する  ・機械学習について実際の流れを理解する  ・Kaggleのチュートリアルを用いて実践を行う  ・scikit-learnを用いて実践を行う アジェンダ 1. Kaggleとは 2. なぜKaggle? 3. Titanic: Machine Learning from Disaster 4. データの中でどれを使う? 5. データ前処理 6. 使用データ 7. 使用する学習手法 8. 学習実行と交差検証 9. 最適化 10. 機械学習の流れ 11. 企業のコンテストを一部紹介 1. Kaggleとは • 誤解を恐れずにまとめれば 
 Kaggleは企業や研究家が、データサイ エンス、機械学習関連のお題をだしてそ れを解くサイトです。 
 賞金がつくものもあり(さらにそれを解くためのコー ドを公開しかつ説明する。その説明についてコメント 等でコミュニケーションを行う機能もあり) 2. なぜKaggle? • 本などの説明では、説明のためのデータセットが使 われていることが多く、実感が湧きにくい。 • 本などの説明では端折られる箇所も、実施する必要 があるため機械学習の実際の流れが理解できる。 • 順位が出るためやる気が出る。(全世界のデータ分 析家と勝負できますし、協力もできます) • 賞金がでます(150万ドルの賞金が出るものもあり) 3. Titanic: Machine Learning From Disaster • 乗客がタイタニックの沈没を生き延びたかどうかを予測 • 訓練用データ(891行 × 12列のcsv) データに一部欠 損あり • テストデータ(418行 × 11列のcsv) データに一部欠 損あり • 訓練用データで学習し、テストデータに対して、生き延 びたかどうかを予測する。 4. データの中でどれを使う?(1/4) • PassengerId:データにシーケンシャルでついている番号 • Survived:生存(0 = No, 1 = Yes) 訓練用データにのみ存在 • Pclass:チケットのクラス(1 = 1st, 2 = 2nd, 3 = 3rd) • Name:名前 • Sex:性別 • Age:年齢 4. データの中でどれを使う?(2/4) • SibSp:タイタニック号に乗っていた兄弟と配偶者の数 • Parch:タイタニック号に乗っていた両親と子どもの数 • Ticket:チケット番号 • Fare:旅客運賃 • Cabin:船室番号 • Embarked:乗船場(C = Cherbourg, Q = Queenstown, S = Southampton) 4. データの中でどれを使う?(3/4) • import numpy as np • import pandas as pd • train = pd.read_csv("train.csv", dtype={"Age": np.float64}, ) • test = pd.read_csv("test.csv", dtype={"Age": np.float64}, ) • train.head(10) 実行コード 4. データの中でどれを使う?(4/4) train_corr = train.corr() train_corr 実行コード 5. データ前処理(1/2) PassengerId以外は使えそうです。 現在解析に使えていないデータがあるので使えるデータ(数値)に変換します。 また欠損データがあるので補正します。 実行コード def correct_data(titanic_data): titanic_data.Age = titanic_data.Age.fillna(titanic_data.Age.median()) titanic_data.Sex = titanic_data.Sex.replace(['male', 'female'], [0, 1]) titanic_data.Embarked = titanic_data.Embarked.fillna("S") titanic_data.Embarked = titanic_data.Embarked.replace(['C', 'S', 'Q'], [0, 1, 2]) titanic_data.Fare = titanic_data.Fare.fillna(titanic_data.Fare.median()) return titanic_data train_data = correct_data(train) test_data = correct_data(test) 5. データ前処理(2/2) train_data_corr = train_data.corr() train_data_corr 実行コード 今回は以下項目を使用します。 ・チケットのクラス ・性別 ・年齢 ・タイタニック号に乗っていた兄弟と配偶者の数 ・タイタニック号に乗っていた両親と子どもの数 ・旅客運賃 ・乗船場 6. 使用データ 7. 使用する学習手法(1/2) ・ロジスティック回帰 ・サポートベクターマシン ・k-最近傍法 ・決定木 ・ランダムフォレスト ・ニューラルネットワーク 参考文献 • Pythonではじめる機械学習 scikit-learnで学ぶ特徴量エンジニアリングと 機械学習の基礎 • https://www.oreilly.co.jp/books/9784873117980/ • 7. 今回使用する学習手法(2/2) 8. 学習実行と交差検証(1/4) predictors = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"] models = [] models.append(("LogisticRegression",LogisticRegression())) models.append(("SVC",SVC())) models.append(("LinearSVC",LinearSVC())) models.append(("KNeighbors",KNeighborsClassifier())) models.append(("DecisionTree",DecisionTreeClassifier())) models.append(("RandomForest",RandomForestClassifier())) models.append(("MLPClassifier",MLPClassifier(solver='lbfgs', random_state=0))) # importはhttps://www.kaggle.com/tflare/testing-multiple-models-with-scikit- learn 参照 実行コード データと学習手法を指定します。 8. 学習実行と交差検証(2/4) results = [] names = [] for name,model in models: result = cross_val_score(model, train_data[predictors], train_data["Survived"], cv=3) names.append(name) results.append(result) 実行コード 交差検証を実施します。 交差検証ではデータセットを訓練データとテストデータに分割し(ここでは3分 割)、それぞれで評価することで精度を安定させる方法です 訓練データ テストデータ 8. 学習実行と交差検証(3/4) LogisticRegression 0.785634118967 SVC 0.687991021324 LinearSVC 0.58810325477 KNeighbors 0.701459034792 DecisionTree 0.766554433221 RandomForest 0.796857463524 MLPClassifier 0.785634118967 for i in range(len(names)): print(names[i],results[i].mean()) 実行コード 3分割されている結果を平均し、評価を出します。 ランダムフォレストが良い結果を出しました。 8. 学習実行と交差検証(4/4) alg = RandomForestClassifier() alg.fit(train_data[predictors], train_data["Survived"]) predictions = alg.predict(test_data[predictors]) submission = pd.DataFrame({ "PassengerId": test_data["PassengerId"], "Survived": predictions }) submission.to_csv('submission.csv', index=False) ランダムフォレストで学習したものを元に、 テストデータで予想をし、その結果をcsvにして送ります。 実行コード 9. 最適化(1/7) 正解率0.74163 7922人中7043位でした。ちょっと悔しい ので最適化します。 ランダムフォレストを最適化します。 9. 最適化(3/7) parameters = { 'n_estimators' : [5, 10, 20, 30, 50, 100, 300], 'max_depth' : [3, 5, 10, 15, 20, 25, 30, 40, 50, 100] 'random_state' : [0], } gsc = GridSearchCV(RandomForestClassifier(), parameters,cv=3) gsc.fit(train_data[predictors], train_data[“Survived"]) 最適化の説明をします。 grid searchを使用すればハイパーパラメータを自動的に最適化してくれます。 ただし実行時間がかかることに注意して下さい。 そして上記等で最適化した結果を適応してみます。 実行コード 9. 最適化(2/7) 正解率0.77990 7922人中4129位まで行きました。 9. 最適化(4/7) 先程のコードをKaggleに公開するとコメントがつきま した。 欠損値を訓練用データからではなくテストデータから求 めるようにしたほうが良いとのことでした。やってみま した。 コードは次ページ 9. 最適化(5/7) def correct_data(train_data, test_data): # Make missing values for training data from test data as well train_data.Age = train_data.Age.fillna(test_data.Age.median()) train_data.Fare = train_data.Fare.fillna(test_data.Fare.median()) test_data.Age = test_data.Age.fillna(test_data.Age.median()) test_data.Fare = test_data.Fare.fillna(test_data.Fare.median()) train_data = correct_data_common(train_data) test_data = correct_data_common(test_data) return train_data, test_data def correct_data_common(titanic_data): titanic_data.Sex = titanic_data.Sex.replace(['male', 'female'], [0, 1]) titanic_data.Embarked = titanic_data.Embarked.fillna("S") titanic_data.Embarked = titanic_data.Embarked.replace(['C', 'S', 'Q'], [0, 1, 2]) return titanic_data train_data, test_data = correct_data(train, test) 実行コード 9. 最適化(6/7) 正解率0.79426 7922人中2189位まで行きました。 9. 最適化(7/7) • さらなる最適化例えば、名前の解析をする。(Mr. Mrs. Miss 等があるためここから推測できないか等) • 別の学習手法を使用する(例えばXGBoost、LightGBM) を使用して見る 10. 機械学習の流れ(1/4) 2. データ入手 3. データ前処理 4. 手法選択 5. ハイパーパラメータ選択 6. モデルの学習 7. モデルの評価 1. 実施内容の決定 10. 機械学習の流れ(2/4) http://scikit-learn.org/stable/tutorial/machine_learning_map/ より 手法選択はアルゴリズム チートシート ハイパーパラメータ選択 grid search 10. 機械学習の流れ(3/4) モデルの評価 交差検証 10. 機械学習の流れ(4/4) Prudential Life Insurance Assessment • Can you make buying life insurance easier? • 生命保険申請者の属性からリスクレベルを算出する • 賞金3万ドル • 既に終了済み(コードが参照できる) • https://www.kaggle.com/c/prudential-life-insurance-assessment 11. 企業のコンテストを一部紹介(1/2) Zillow Prize: Zillow’s Home Value Prediction (Zestimate) • Can you improve the algorithm that changed the world of real estate? • 自宅のすべての機能を考慮して、Zestimateと実際の販売価格との間 の誤差を予測する • 賞金120万ドル • 4ヶ月後に終了 • https://www.kaggle.com/c/zillow-prize-1 11. 企業のコンテストを一部紹介(2/2) 最後に ご清聴ありがとうござ いました。

×

Modal Header

Modal body