[{"data":1,"prerenderedAt":835},["ShallowReactive",2],{"content-\u002Fcontents\u002Fml_titanic_part3":3,"surroundPost-\u002Fcontents\u002Fml_titanic_part3":826},{"id":4,"title":5,"body":6,"createdAt":816,"description":222,"draft":817,"extension":818,"meta":819,"navigation":239,"path":820,"seo":821,"stem":822,"tags":823,"thumbnail":824,"updatedAt":816,"__hash__":825},"contents\u002Fcontents\u002Fml_titanic_part3.md","【機械学習】初心者がKaggleのtitanicで勉強してみた(アルゴリズム選定編)",{"type":7,"value":8,"toc":808},"minimark",[9,13,17,34,48,51,60,63,66,69,72,75,82,85,92,95,104,110,120,123,150,156,162,165,171,174,177,180,183,190,201,207,210,213,216,265,272,278,482,487,494,504,507,510,513,522,529,532,535,587,590,596,605,607,613,616,720,723,726,729,754,757,760,769,772,781,784,787,804],[10,11,12],"h2",{"id":12},"はじめに",[14,15,16],"p",{},"初心者が Kaggle の Titanic をやってみた 3 回目アルゴリズム選定編やります！",[14,18,19,20,23,28,30],{},"（↓ これまでの記事）",[21,22],"br",{},[24,25,27],"a",{"href":26},"ml_titanic","【機械学習】初心者が Kaggle の titanic で勉強してみた",[21,29],{},[24,31,33],{"href":32},"ml_titanic_part2","【機械学習】初心者が Kaggle の titanic で勉強してみた(前処理編)",[14,35,36,37,41,42,44,45,47],{},"第 3 回目にしてようやく",[38,39,40],"strong",{},"機械学習","の部分です。",[21,43],{},"\n今回は、前回までで前処理したデータを使って機械学習アルゴリズムを利用して実際に生存者予測を行います。",[21,46],{},"\nその過程で、交差検証やホールドアウトにも触れます。",[14,49,50],{},"いや〜長かった。",[14,52,53,54,56,57,59],{},"調べながらやっていたらこんなに時間がかかってしまった。",[21,55],{},"\nしかも、やってみてわかったが調べれば調べるほどわからないことが増えていくという。。。",[21,58],{},"\n世の機械学習エンジニアはどうやって勉強してるんだろう。",[14,61,62],{},"ゆくゆくは論文のまとめだったりをやっていきたいが道のりは長い。",[10,64,65],{"id":65},"アルゴリズム選定",[14,67,68],{},"機械学習には様々なアルゴリズムが存在する。問題を解決するには、解きたい問題に適したアルゴリズムを選ぶ必要がある。",[14,70,71],{},"さらにアルゴリズムを選ぶ為には、どんな問題なのか、どんなアルゴリズムなのかを知る必要がある。",[14,73,74],{},"そこで、もう一度自分たちがどんな問題を解決しようとしているのか見直してみる。",[14,76,77,78,81],{},"今回、最終的にやりたいことは",[38,79,80],{},"生存者予測","である。つまり生き残るか否か、0 か 1 かを予測することだ。",[14,83,84],{},"つまり、これは 2 値分類問題だと考えられる。\nそして、与えられたデータには乗客の情報とその乗客が生き残ったかどうかの情報がある。",[14,86,87,88,91],{},"ということは、この問題は機械学習の中でも",[38,89,90],{},"教師あり学習","と呼ばれる学習手法に分類されるものだとわかる。",[14,93,94],{},"もはや説明するまでもないと思うが、自分のために書いておくと機械学習は大きく分けて以下の二つの学習手法がある。",[96,97,98,101],"ol",{},[99,100,90],"li",{},[99,102,103],{},"教師なし学習",[14,105,106,107,109],{},"問題を解く際には、解こうとしている問題が教師あり学習で解けるのか教師なしでやらなければならないのか考える必要がある。",[21,108],{},"\n自分は、正解が用意されていれば教師あり学習だと単純に考えている（これでよいのか？）。",[14,111,112,113,116,117,119],{},"ここまでを整理すると、今回の問題は",[38,114,115],{},"2 値分類","の",[38,118,90],{},"であることがわかった。",[14,121,122],{},"この問題が解けるアルゴリズムを調べると以下のものがあった。",[124,125,126,129,132,135,138,141,144,147],"ul",{},[99,127,128],{},"k-最近傍法",[99,130,131],{},"ロジスティック回帰",[99,133,134],{},"ナイーブベイズ",[99,136,137],{},"決定木",[99,139,140],{},"サポートベクタマシン",[99,142,143],{},"ニューラルネットワーク",[99,145,146],{},"AdaBoost",[99,148,149],{},"ランダムフォレスト",[14,151,152,153,155],{},"他にもあった気がするが多すぎてツライのでこれだけあげた。",[21,154],{},"\n特にサポートベクタマシンは難しく種類もいくつかあるため調査は今後の課題にしとく。",[14,157,158,159,161],{},"これでようやく使えそうなアルゴリズムが揃った。",[21,160],{},"\n次はこれらのアルゴリズムをテストして精度のいいものを選定する。",[10,163,164],{"id":164},"アルゴリズム評価方法",[14,166,167,168,170],{},"次はアルゴリズムを選定するために、訓練データをまた検証用と訓練用にわける。",[21,169],{},"\nただ、ここで参考書などを読んでて頭がごっちゃになったので言葉を整理したい。",[14,172,173],{},"自分が混乱したのはホールドアウトと交差検証についてだ。",[14,175,176],{},"アルゴリズムを選定する方法として、これらがよくあげられるが何がなんのためのものなのか、理解があいまいになっていた。\nそれらについて説明しておく。",[14,178,179],{},"機械学習ではよく訓練データとテストデータのように分けられているのをよく見かけると思う。",[14,181,182],{},"実際、今回の Titanic でも提供されたデータは訓練用とテスト用に分けられている。なぜこのように分けるかというと、機械学習では最終的に未知のデータに対する精度が要求されるからだ。",[14,184,185,186,189],{},"そこで、擬似的に未知のデータを作り出す方法として、今あるデータを訓練とテスト用に分ける",[38,187,188],{},"交差検証","と呼ばれる手法が一般的に用いられる。",[14,191,192,193,196,197,200],{},"交差検証には大きく分けて二つの手法がある。",[38,194,195],{},"ホールドアウト","と",[38,198,199],{},"k-分割交差検証","だ。",[14,202,203,204,206],{},"ホールドアウトは先ほど例にあげたもので、事前に訓練とテスト用にデータを分ける方法だ。",[21,205],{},"\nk - 分割交差検証は、全体を k 分割し、それらのうち一つをテストデータとして扱い訓練する。これを k 個それぞれに行うのが k - 分割交差検証になる。",[14,208,209],{},"両者の違いとしては、ホールドアウトだと選んだテストデータによっては偶然いい性能がでるという可能性があるが、k-分割の方では、その可能性を低くできる。",[10,211,212],{"id":212},"アルゴリズム検証方法",[14,214,215],{},"アルゴリズムを検証するために、訓練データをさらに検証用と訓練用にわける。",[217,218,223],"pre",{"className":219,"code":220,"language":221,"meta":222,"style":222},"language-py shiki shiki-themes github-dark","from sklearn import model_selection, metrics\n\n# testデータで試す前に訓練データでいくつかモデルを試す\n# cleaned_data：前処理済みデータ（ndarray）\n# y：正解データ\nX_train, X_test, y_train, y_test = model_selection.train_test_split(cleaned_data, y, random_state=1)\n","py","",[224,225,226,234,241,247,253,259],"code",{"__ignoreMap":222},[227,228,231],"span",{"class":229,"line":230},"line",1,[227,232,233],{},"from sklearn import model_selection, metrics\n",[227,235,237],{"class":229,"line":236},2,[227,238,240],{"emptyLinePlaceholder":239},true,"\n",[227,242,244],{"class":229,"line":243},3,[227,245,246],{},"# testデータで試す前に訓練データでいくつかモデルを試す\n",[227,248,250],{"class":229,"line":249},4,[227,251,252],{},"# cleaned_data：前処理済みデータ（ndarray）\n",[227,254,256],{"class":229,"line":255},5,[227,257,258],{},"# y：正解データ\n",[227,260,262],{"class":229,"line":261},6,[227,263,264],{},"X_train, X_test, y_train, y_test = model_selection.train_test_split(cleaned_data, y, random_state=1)\n",[14,266,267,268,271],{},"これで",[38,269,270],{},"ついに","アルゴリズムにデータをいれていく！！",[14,273,274,275,277],{},"今回は結果を見比べたかったのでこんな感じにしてみた。",[21,276],{},"\nニューラルネットワークはライブラリの使い方を勉強しなきゃなので、また今度やります。。。",[217,279,281],{"className":219,"code":280,"language":221,"meta":222,"style":222},"from sklearn.linear_model import LogisticRegression\nfrom sklearn.neighbors import KNeighborsClassifier # K近傍法\nfrom sklearn.tree import DecisionTreeClassifier # 決定木\nfrom sklearn.ensemble import RandomForestClassifier # ランダムフォレスト\nfrom sklearn.ensemble import AdaBoostClassifier # AdaBoost\nfrom sklearn.naive_bayes import GaussianNB # ナイーブ・ベイズ\nimport  pickle\n\nclassifiers = [\n    LogisticRegression(),\n    KNeighborsClassifier(),\n    DecisionTreeClassifier(),\n    RandomForestClassifier(),\n    AdaBoostClassifier(),\n    GaussianNB(),\n]\n\nnames = [\"Logistic Regression\", \"Nearest Neighbors\",\n         \"Decision Tree\",\"Random Forest\", \"AdaBoost\", \"Naive Bayes\"]\n\n# アルゴリズムを順に実行\nresult = []\n\nfor clf, name in zip(classifiers, names):\n    clf.fit(X_train, y_train)\n    score1 = clf.score(X_train, y_train)\n    score2 = clf.score(X_test, y_test)\n    fname = name + \"{}\".format(\".pickle\")\n    result.append([score1, score2])\n    with open(fname, 'wb') as f:\n        pickle.dump(clf, f)\n    print(name)\n\ndf_result = pd.DataFrame(result, columns=['train', 'test'], index = names)\ndf_result\n",[224,282,283,288,293,298,303,308,313,319,324,330,336,342,348,354,360,366,372,377,383,389,394,400,406,411,417,423,429,435,441,447,453,459,465,470,476],{"__ignoreMap":222},[227,284,285],{"class":229,"line":230},[227,286,287],{},"from sklearn.linear_model import LogisticRegression\n",[227,289,290],{"class":229,"line":236},[227,291,292],{},"from sklearn.neighbors import KNeighborsClassifier # K近傍法\n",[227,294,295],{"class":229,"line":243},[227,296,297],{},"from sklearn.tree import DecisionTreeClassifier # 決定木\n",[227,299,300],{"class":229,"line":249},[227,301,302],{},"from sklearn.ensemble import RandomForestClassifier # ランダムフォレスト\n",[227,304,305],{"class":229,"line":255},[227,306,307],{},"from sklearn.ensemble import AdaBoostClassifier # AdaBoost\n",[227,309,310],{"class":229,"line":261},[227,311,312],{},"from sklearn.naive_bayes import GaussianNB # ナイーブ・ベイズ\n",[227,314,316],{"class":229,"line":315},7,[227,317,318],{},"import  pickle\n",[227,320,322],{"class":229,"line":321},8,[227,323,240],{"emptyLinePlaceholder":239},[227,325,327],{"class":229,"line":326},9,[227,328,329],{},"classifiers = [\n",[227,331,333],{"class":229,"line":332},10,[227,334,335],{},"    LogisticRegression(),\n",[227,337,339],{"class":229,"line":338},11,[227,340,341],{},"    KNeighborsClassifier(),\n",[227,343,345],{"class":229,"line":344},12,[227,346,347],{},"    DecisionTreeClassifier(),\n",[227,349,351],{"class":229,"line":350},13,[227,352,353],{},"    RandomForestClassifier(),\n",[227,355,357],{"class":229,"line":356},14,[227,358,359],{},"    AdaBoostClassifier(),\n",[227,361,363],{"class":229,"line":362},15,[227,364,365],{},"    GaussianNB(),\n",[227,367,369],{"class":229,"line":368},16,[227,370,371],{},"]\n",[227,373,375],{"class":229,"line":374},17,[227,376,240],{"emptyLinePlaceholder":239},[227,378,380],{"class":229,"line":379},18,[227,381,382],{},"names = [\"Logistic Regression\", \"Nearest Neighbors\",\n",[227,384,386],{"class":229,"line":385},19,[227,387,388],{},"         \"Decision Tree\",\"Random Forest\", \"AdaBoost\", \"Naive Bayes\"]\n",[227,390,392],{"class":229,"line":391},20,[227,393,240],{"emptyLinePlaceholder":239},[227,395,397],{"class":229,"line":396},21,[227,398,399],{},"# アルゴリズムを順に実行\n",[227,401,403],{"class":229,"line":402},22,[227,404,405],{},"result = []\n",[227,407,409],{"class":229,"line":408},23,[227,410,240],{"emptyLinePlaceholder":239},[227,412,414],{"class":229,"line":413},24,[227,415,416],{},"for clf, name in zip(classifiers, names):\n",[227,418,420],{"class":229,"line":419},25,[227,421,422],{},"    clf.fit(X_train, y_train)\n",[227,424,426],{"class":229,"line":425},26,[227,427,428],{},"    score1 = clf.score(X_train, y_train)\n",[227,430,432],{"class":229,"line":431},27,[227,433,434],{},"    score2 = clf.score(X_test, y_test)\n",[227,436,438],{"class":229,"line":437},28,[227,439,440],{},"    fname = name + \"{}\".format(\".pickle\")\n",[227,442,444],{"class":229,"line":443},29,[227,445,446],{},"    result.append([score1, score2])\n",[227,448,450],{"class":229,"line":449},30,[227,451,452],{},"    with open(fname, 'wb') as f:\n",[227,454,456],{"class":229,"line":455},31,[227,457,458],{},"        pickle.dump(clf, f)\n",[227,460,462],{"class":229,"line":461},32,[227,463,464],{},"    print(name)\n",[227,466,468],{"class":229,"line":467},33,[227,469,240],{"emptyLinePlaceholder":239},[227,471,473],{"class":229,"line":472},34,[227,474,475],{},"df_result = pd.DataFrame(result, columns=['train', 'test'], index = names)\n",[227,477,479],{"class":229,"line":478},35,[227,480,481],{},"df_result\n",[483,484],"img",{"alt":485,"img-src":486},"output","\u002Fimg\u002Fkaggle_titanic\u002Ftitanic_output_13.png",[14,488,489,490,493],{},"検証データでの結果をみると、",[224,491,492],{},"Logistic Regression","が一番高く、それ以外は検証データの結果をみるにそこまで違いはなさそう。",[14,495,496,497,499,500,503],{},"まあ、とりあえず結果が一番いい",[224,498,492],{},"と有名な",[224,501,502],{},"Random Forest","を選択することにする。",[14,505,506],{},"これでアルゴリズムを選定できたぞ！",[14,508,509],{},"次は、パラメータチューニングだ！",[10,511,512],{"id":512},"パラメータチューニング",[14,514,515,516,518,519,521],{},"アルゴリズムには利用者が自分で設定しなければいけないパラメータが存在する。",[21,517],{},"\nそれらのパラメータは非常に重要でアルゴリズムの性能を大きく左右する。",[21,520],{},"\nそこで、上で選定したアルゴリズムについてもパラメータチューニングを行っていく。",[14,523,524,525,528],{},"これには、sklearn の",[38,526,527],{},"グリッドサーチ","を用いる。",[14,530,531],{},"グリッドサーチでは、パラメータととりうる値を与えることで、それらの組み合わせすべてを試して、ベストな組み合わせを算出してくれる。",[14,533,534],{},"さっそくロジスティック回帰とランダムフォレストで試してみる。",[217,536,538],{"className":219,"code":537,"language":221,"meta":222,"style":222},"from sklearn.model_selection import GridSearchCV\n\n# ロジスティック回帰のパラメータ\nparameter={\"C\":[10**i for i in range(-2,4)],\"random_state\":[1],}\n\ngrid_search = GridSearchCV(LogisticRegression(), parameter, cv=5)\ngrid_search.fit(X_train, y_train)\n\nprint(\"Best parameters : {}\".format(grid_search.best_params_))\nprint(\"Best cross-validation score : {:.3f}\".format(grid_search.best_score_))\n",[224,539,540,545,549,554,559,563,568,573,577,582],{"__ignoreMap":222},[227,541,542],{"class":229,"line":230},[227,543,544],{},"from sklearn.model_selection import GridSearchCV\n",[227,546,547],{"class":229,"line":236},[227,548,240],{"emptyLinePlaceholder":239},[227,550,551],{"class":229,"line":243},[227,552,553],{},"# ロジスティック回帰のパラメータ\n",[227,555,556],{"class":229,"line":249},[227,557,558],{},"parameter={\"C\":[10**i for i in range(-2,4)],\"random_state\":[1],}\n",[227,560,561],{"class":229,"line":255},[227,562,240],{"emptyLinePlaceholder":239},[227,564,565],{"class":229,"line":261},[227,566,567],{},"grid_search = GridSearchCV(LogisticRegression(), parameter, cv=5)\n",[227,569,570],{"class":229,"line":315},[227,571,572],{},"grid_search.fit(X_train, y_train)\n",[227,574,575],{"class":229,"line":321},[227,576,240],{"emptyLinePlaceholder":239},[227,578,579],{"class":229,"line":326},[227,580,581],{},"print(\"Best parameters : {}\".format(grid_search.best_params_))\n",[227,583,584],{"class":229,"line":332},[227,585,586],{},"print(\"Best cross-validation score : {:.3f}\".format(grid_search.best_score_))\n",[483,588],{"alt":485,"img-src":589},"\u002Fimg\u002Fkaggle_titanic\u002Ftitanic_output_14.png",[14,591,592,593,595],{},"結果をみると、チューニング後と変わってない？？",[21,594],{},"\n少し違うパラメータでやってみる。",[217,597,599],{"className":219,"code":598,"language":221,"meta":222,"style":222},"parameter={\"C\":[i for i in range(1, 20 )],\"random_state\":[1],}\n",[224,600,601],{"__ignoreMap":222},[227,602,603],{"class":229,"line":230},[227,604,598],{},[483,606],{"alt":485,"img-src":589},[14,608,609,610,612],{},"どうやらこれが現状のベストのようだ。",[21,611],{},"\n思ったよりかなりしょぼい。なにか間違っている気がする。",[14,614,615],{},"いったんランダムフォレストについても同様にやっていく。",[217,617,619],{"className":219,"code":618,"language":221,"meta":222,"style":222},"from sklearn.metrics import classification_report\n\n# ランダムフォレストのパラメータ\n# n_estimators → 決定木の数\n# max_features → 決定木の特徴量の数\n# random_state → 乱数シード\n# max_depth → 決定木の深さ\n# min_samples_split → 決定木を分割する際のサンプル数の最小数\nparameter={\n    \"n_estimators\":[i  for i in range(10, 100, 10)],\n    \"criterion\":[\"gini\",\"entropy\"],\n    \"max_depth\":[i for i in range(1,10,1)],\n    \"min_samples_split\": [2, 4, 10,12,16],\n    \"random_state\":[3]\n}\n\ngrid_search = GridSearchCV(RandomForestClassifier(), parameter, cv=5)\ngrid_search.fit(X_train, y_train)\n\nprint(\"Best parameters : {}\".format(grid_search.best_params_))\nprint(\"Best cross-validation score : {:.3f}\".format(grid_search.best_score_))\n",[224,620,621,626,630,635,640,645,650,655,660,665,670,675,680,685,690,695,699,704,708,712,716],{"__ignoreMap":222},[227,622,623],{"class":229,"line":230},[227,624,625],{},"from sklearn.metrics import classification_report\n",[227,627,628],{"class":229,"line":236},[227,629,240],{"emptyLinePlaceholder":239},[227,631,632],{"class":229,"line":243},[227,633,634],{},"# ランダムフォレストのパラメータ\n",[227,636,637],{"class":229,"line":249},[227,638,639],{},"# n_estimators → 決定木の数\n",[227,641,642],{"class":229,"line":255},[227,643,644],{},"# max_features → 決定木の特徴量の数\n",[227,646,647],{"class":229,"line":261},[227,648,649],{},"# random_state → 乱数シード\n",[227,651,652],{"class":229,"line":315},[227,653,654],{},"# max_depth → 決定木の深さ\n",[227,656,657],{"class":229,"line":321},[227,658,659],{},"# min_samples_split → 決定木を分割する際のサンプル数の最小数\n",[227,661,662],{"class":229,"line":326},[227,663,664],{},"parameter={\n",[227,666,667],{"class":229,"line":332},[227,668,669],{},"    \"n_estimators\":[i  for i in range(10, 100, 10)],\n",[227,671,672],{"class":229,"line":338},[227,673,674],{},"    \"criterion\":[\"gini\",\"entropy\"],\n",[227,676,677],{"class":229,"line":344},[227,678,679],{},"    \"max_depth\":[i for i in range(1,10,1)],\n",[227,681,682],{"class":229,"line":350},[227,683,684],{},"    \"min_samples_split\": [2, 4, 10,12,16],\n",[227,686,687],{"class":229,"line":356},[227,688,689],{},"    \"random_state\":[3]\n",[227,691,692],{"class":229,"line":362},[227,693,694],{},"}\n",[227,696,697],{"class":229,"line":368},[227,698,240],{"emptyLinePlaceholder":239},[227,700,701],{"class":229,"line":374},[227,702,703],{},"grid_search = GridSearchCV(RandomForestClassifier(), parameter, cv=5)\n",[227,705,706],{"class":229,"line":379},[227,707,572],{},[227,709,710],{"class":229,"line":385},[227,711,240],{"emptyLinePlaceholder":239},[227,713,714],{"class":229,"line":391},[227,715,581],{},[227,717,718],{"class":229,"line":396},[227,719,586],{},[483,721],{"alt":485,"img-src":722},"\u002Fimg\u002Fkaggle_titanic\u002Ftitanic_output_15.png",[14,724,725],{},"うおーーー！。こっちはめっちゃ精度上がったぞ！！",[14,727,728],{},"ちょっとロジスティック回帰はいったん置いといて、ランダムフォレストをベストパラメータで検証データを試していく。",[217,730,732],{"className":219,"code":731,"language":221,"meta":222,"style":222},"rf = RandomForestClassifier(**grid_search.best_params_)\nrf.fit(X_train, y_train)\ntest_score = rf.score(X_test, y_test)\nprint(\"Score with best parameteras : {}\".format(test_score))\n",[224,733,734,739,744,749],{"__ignoreMap":222},[227,735,736],{"class":229,"line":230},[227,737,738],{},"rf = RandomForestClassifier(**grid_search.best_params_)\n",[227,740,741],{"class":229,"line":236},[227,742,743],{},"rf.fit(X_train, y_train)\n",[227,745,746],{"class":229,"line":243},[227,747,748],{},"test_score = rf.score(X_test, y_test)\n",[227,750,751],{"class":229,"line":249},[227,752,753],{},"print(\"Score with best parameteras : {}\".format(test_score))\n",[483,755],{"alt":485,"img-src":756},"\u002Fimg\u002Fkaggle_titanic\u002Ftitanic_output_16.png",[14,758,759],{},"うーむ。よくはなったが微妙なスコア。",[14,761,762,763,765,766,768],{},"これは特徴量設計に立ち戻ったほうがよさそう。",[21,764],{},"\n検証データでいくつのスコアをだせば満足していいかわからんが 90%くらいの精度は欲しい。",[21,767],{},"\nパラメータチューニングしたら 95%くらいの精度になると勝手に思っていたんだがなぁ。",[10,770,771],{"id":771},"まとめ",[14,773,774,775,777,778,780],{},"今回で終わりかと思ったが道のりは長そう。",[21,776],{},"\nそれと今回あたりからマシンパワーが欲しくなった。",[21,779],{},"\nほんとはサポートベクタマシンも試してたんだが、計算が遅すぎて断念してしまった。",[14,782,783],{},"パソコン買うかぁ。。。",[14,785,786],{},"参考書籍です。",[124,788,789,797],{},[99,790,791],{},[24,792,796],{"href":793,"rel":794},"https:\u002F\u002Famzn.to\u002F38PNOK9",[795],"nofollow","scikit-learn と TensorFlow による実践機械学習",[99,798,799],{},[24,800,803],{"href":801,"rel":802},"https:\u002F\u002Famzn.to\u002F2O246HK",[795],"Python ではじめる機械学習 ―scikit-learn で学ぶ特徴量エンジニアリングと機械学習の基礎",[805,806,807],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":222,"searchDepth":236,"depth":236,"links":809},[810,811,812,813,814,815],{"id":12,"depth":236,"text":12},{"id":65,"depth":236,"text":65},{"id":164,"depth":236,"text":164},{"id":212,"depth":236,"text":212},{"id":512,"depth":236,"text":512},{"id":771,"depth":236,"text":771},"2019-03-02",false,"md",{},"\u002Fcontents\u002Fml_titanic_part3",{"title":5,"description":222},"contents\u002Fml_titanic_part3",[40],"\u002Fimg\u002Ftwitter-card.png","5JxN-MRYh4x20Tvx6LpO9PZ4XN1AufraTnRs6opZs8U",[827,831],{"title":828,"path":829,"stem":830,"children":-1},"【機械学習】初心者がKaggleのtitanicで勉強してみた(前処理編)","\u002Fcontents\u002Fml_titanic_part2","contents\u002Fml_titanic_part2",{"title":832,"path":833,"stem":834,"children":-1},"【機械学習】初心者がKaggleのtitanicで勉強してみた(モデル評価編)","\u002Fcontents\u002Fml_titanic_part4","contents\u002Fml_titanic_part4",1784936718742]