tropicbirdのブログ

備忘録です。

【kaggle】タイタニックのコンペ(7)

Kaggleで定番のタイタニック号の生存者の分析をPythonで行う記録。

↓コンペのサイトはここです。
Titanic: Machine Learning from Disaster | Kaggle

Pythonによる分析の一例をManav Sehgalさんのカーネルを参考に(と言いうかこれに沿って)行います。
↓Manav Sehgalさんの分析手順はここで確認ができます。
Titanic Data Science Solutions | Kaggle

18. モデル、予測、解決

・今までのプロセスでデータの予測をする準備が整った。
・たくさんの予測モデルがある中で、課題の内容に即したモデルを選ぶ必要gあある。
・今回の課題は分類(classification)と回帰(regression)の内容である。
・生存の有無と各変数の関係を知りたい。
・今回は教師あり学習である。
・「教師あり学習」と「分類及び回帰」に適した予測方法には以下がある。

#不要な属性を取り除く。
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)