【kaggle】タイタニックのコンペ(7)
Kaggleで定番のタイタニック号の生存者の分析をPythonで行う記録。
↓コンペのサイトはここです。
Titanic: Machine Learning from Disaster | Kaggle
Pythonによる分析の一例をManav Sehgalさんのカーネルを参考に(と言いうかこれに沿って)行います。
↓Manav Sehgalさんの分析手順はここで確認ができます。
Titanic Data Science Solutions | Kaggle
18. モデル、予測、解決
・今までのプロセスでデータの予測をする準備が整った。
・たくさんの予測モデルがある中で、課題の内容に即したモデルを選ぶ必要gあある。
・今回の課題は分類(classification)と回帰(regression)の内容である。
・生存の有無と各変数の関係を知りたい。
・今回は教師あり学習である。
・「教師あり学習」と「分類及び回帰」に適した予測方法には以下がある。
- Logistic Regression:ロジスティック回帰
- KNN or k-Nearest Neighbors:k近傍法
- Support Vector Machines:サポートベクターマシン
- Naive Bayes classifier:ナイーブベイズ分類器
- Decision Tree:決定木
- Random Forrest:ランダムフォレスト
- Perceptron:パーセプトロン
- Artificial neural network:人工ニューラルネットワーク
- RVM or Relevance Vector Machine:関連ベクトルマシン
#不要な属性を取り除く。 train_df=train_df.drop(['FamilySize','Age','AgeBand','Fare_category','SibSp','Parch'],axis=1) train_df.info() ''' <class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 9 columns): Survived 891 non-null int64 Pclass 891 non-null int64 Sex 891 non-null int32 Fare 891 non-null int32 Embarked 891 non-null int32 Title 891 non-null int64 Age_category 891 non-null float64 IsAlone 891 non-null int64 Age*Class 891 non-null float64 dtypes: float64(2), int32(3), int64(4) memory usage: 52.3 KB ''' test_df=test_df.drop(['FamilySize','Age','Fare_category','SibSp','Parch'],axis=1) test_df.info() ''' <class 'pandas.core.frame.DataFrame'> RangeIndex: 418 entries, 0 to 417 Data columns (total 9 columns): PassengerId 418 non-null int64 Pclass 418 non-null int64 Sex 418 non-null int32 Fare 418 non-null int32 Embarked 418 non-null int32 Title 418 non-null int64 Age_category 418 non-null float64 IsAlone 418 non-null int64 Age*Class 418 non-null float64 dtypes: float64(2), int32(3), int64(4) memory usage: 24.6 KB ''' #モデルに当てはめるための前処理 X_train=train_df.drop('Survived',axis=1) Y_train=train_df['Survived'] X_test=test_df.drop('PassengerId',axis=1).copy() X_train.shape, Y_train.shape, X_test.shape #出力:((891, 8), (891,), (418, 8)) from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC, LinearSVC from sklearn.ensemble import RandomForestClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.naive_bayes import GaussianNB from sklearn.linear_model import Perceptron from sklearn.linear_model import SGDClassifier from sklearn.tree import DecisionTreeClassifier
・Logistic Regression:ロジスティック回帰
logreg=LogisticRegression() logreg.fit(X_train,Y_train) Y_pred=logreg.predict(X_test) acc_log=round(logreg.score(X_train,Y_train)*100,2) acc_log #出力:80.92
#ロジスティック回帰では各属性の係数を計算することで、それぞれが結果に与える影響を検証することが可能である。正の係数は生存確率を高め、負の係数は生存確率を低くする。Sexは女性が0,男性が1なので、男性に方が生存確率を低くすることが分かる。 coeff_df=pd.DataFrame(train_df.columns.delete(0)) coeff_df.columns=['Feature'] coeff_df['Correlation']=pd.Series(logreg.coef_[0]) coeff_df.sort_values(by='Correlation',ascending=False) ''' Feature Correlation 4 Title 0.440642 6 IsAlone 0.377805 3 Embarked 0.292706 2 Fare 0.061489 7 Age*Class -0.138891 5 Age_category -0.217198 0 Pclass -0.885901 1 Sex -2.119842 '''
・Support Vector Machines:サポートベクターマシン
svc=SVC() svc.fit(X_train,Y_train) Y_pred=svc.predict(X_test) acc_svc=round(svc.score(X_train,Y_train)*100,2) acc_svc #出力:83.5
・KNN or k-Nearest Neighbors:k近傍法
knn=KNeighborsClassifier(n_neighbors=3) knn.fit(X_train,Y_train) Y_pred=knn.predict(X_test) acc_knn=round(knn.score(X_train,Y_train)*100,2) acc_knn #出力:83.95
・Naive Bayes classifier:ナイーブベイズ分類器
gaussian=GaussianNB() gaussian.fit(X_train,Y_train) Y_pred=gaussian.predict(X_test) acc_gaussian=round(gaussian.score(X_train,Y_train)*100,2) acc_gaussian #出力:76.88
・Perceptron:パーセプトロン
perceptron=Perceptron() perceptron.fit(X_train,Y_train) Y_pred=perceptron.predict(X_test) acc_perceptron=round(perceptron.score(X_train,Y_train)*100,2) acc_perceptron #出力:78.45
・線形SVM
linear_svc=LinearSVC() linear_svc.fit(X_train,Y_train) Y_pred=linear_svc.predict(X_test) acc_linear_svc=round(linear_svc.score(X_train,Y_train)*100,2) acc_linear_svc #出力:79.57
・Stochastic Gradient Descent:確率的勾配降下法
sgd = SGDClassifier() sgd.fit(X_train, Y_train) Y_pred = sgd.predict(X_test) acc_sgd = round(sgd.score(X_train, Y_train) * 100, 2) acc_sgd #出力:78.68
・Decision Tree:決定木
decision_tree = DecisionTreeClassifier() decision_tree.fit(X_train, Y_train) Y_pred = decision_tree.predict(X_test) acc_decision_tree = round(decision_tree.score(X_train, Y_train) * 100, 2) acc_decision_tree #出力:86.64
・Random Forrest:ランダムフォレスト
random_forest = RandomForestClassifier(n_estimators=100) random_forest.fit(X_train, Y_train) Y_pred = random_forest.predict(X_test) random_forest.score(X_train, Y_train) acc_random_forest = round(random_forest.score(X_train, Y_train) * 100, 2) acc_random_forest #出力:86.64
・モデルの精度を比較する。
models=pd.DataFrame({ 'Model':['Support Vector Machines','KNN','Logistic Regression', 'Random Forest','Naive Bayes','Perceptron', 'Stochastic Gradient Decent','Linear SVC', 'Decesion Tree'], 'Score':[acc_svc,acc_knn,acc_log,acc_random_forest,acc_gaussian, acc_perceptron,acc_sgd,acc_linear_svc,acc_decision_tree]}) models.sort_values(by='Score',ascending=False) '''出力 Model Score 3 Random Forest 86.64 8 Decesion Tree 86.64 1 KNN 83.95 0 Support Vector Machines 83.50 2 Logistic Regression 80.92 7 Linear SVC 79.57 6 Stochastic Gradient Decent 78.68 5 Perceptron 78.45 4 Naive Bayes 76.88 ''' #提出するデータを作成する。 submission=pd.DataFrame({'PassengerId':test_df['PassengerId'], 'Survived':Y_pred}) submission.head() '''出力 PassengerId Survived 0 892 0 1 893 1 2 894 0 3 895 0 4 896 1 ''' #submissionをcsv形式で書き出し、kaggleのコンペに提出する。 submission.to_csv('submission.csv',index=False)