1. 程式人生 > >Kaggle中Titanic專案簡單入門

Kaggle中Titanic專案簡單入門

首先,再kaggle註冊帳號,找到Titanic專案,9659個隊伍,估計全部都是菜鳥:
這裡寫圖片描述
下載train和test集,提交的檔案:
這裡寫圖片描述
首先,二話不說,先把下載的《gender_submission.csv》直接提交上去:
這裡寫圖片描述
這樣,我們就得到了第一個成績:0.76555,還行,好歹比2xxx多個隊伍強。
再看看說明,最終評價的標準是ACC
下面開始正式幹活了:
先匯入各種庫,讀取訓練集。

#coding=utf-8
import pandas as pd
from pandas import Series,DataFrame 
import random
import numpy as
np from datetime import date import datetime as dt from numpy import nan as NA from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble import GradientBoostingRegressor import warnings warnings.filterwarnings("ignore"
) #讀取資料 traindata = pd.read_csv("train.csv",header=0) testdata = pd.read_csv("test.csv",header=0) print(traindata.shape) print(traindata.head(5))

下面開始資料清理了,
首先看看哪裡有缺失值:(Age,Cabin,Embarked,Fare

print(traindata.isnull().any())
print(testdata.isnull().any())

最終輸出:
PassengerId False
Survived False
Pclass False
Name False
Sex False
Age True
SibSp False
Parch False
Ticket False
Fare False
Cabin True
Embarked True
dtype: bool
PassengerId False
Pclass False
Name False
Sex False
Age True
SibSp False
Parch False
Ticket False
Fare True
Cabin True
Embarked False
dtype: bool

下面我們一個一個變數看過去:
和下列程式碼類似:

print(traindata.Survived.describe())

PassengerId沒啥好說的,就是個ID號,
Survived是否生存的標記,0,1
Pclass票價等級,1、2、3
Name姓名,為了簡單起見,我們先不使用這個特徵
Sex,性別,我們轉換為0、1(乘客男的更加多點)

traindata.Sex[traindata.Sex=='male'] = 0
traindata.Sex[traindata.Sex=='female'] = 1
print(traindata.Sex.describe())
testdata.Sex[testdata.Sex=='male'] = 0
testdata.Sex[testdata.Sex=='female'] = 1
print(testdata.Sex.describe())

Age年齡,train和test集都有很多缺失值,均值都是30左右
所以,我們使用30來替換缺失值(train和test集的分佈都差不多)

traindata.Age[traindata.Age.isnull()] = 30
print(traindata.Age.describe())
testdata.Age[testdata.Age.isnull()] = 30
print(testdata.Age.describe())

SibSp,Parch,沒看明白什麼意思,反正都是資料
Ticket,票的編號,這個似乎沒有什麼用吧,先不管了
Fare,票價,其中test集有缺失值,為了簡單起見,直接用均值35代替

testdata.Fare[testdata.Fare.isnull()]=35
print(testdata.Fare.describe())

Cabin,船倉,為簡單起見,不考慮了
Embarked,上船港口,為簡單起見,也不考慮了
資料清理就先這樣了,下面開始建立模型:

UseFlag = traindata['Survived'].values
#print(UseFlag)
UseFeature = traindata[['Pclass','Sex','Age','SibSp','Parch','Fare']].values
#print(UseFeature)
rf=RandomForestClassifier()#這裡使用了預設的引數設定  
rf.fit(UseFeature,UseFlag)#進行模型的訓練  

temp = rf.predict(UseFeature)
#print(temp)
from sklearn.metrics import accuracy_score
accuracy_score(UseFlag, temp)

輸出測試集合的ACC:0.969696
下面我們預測test集

TestFeature = testdata[['Pclass','Sex','Age','SibSp','Parch','Fare']].values
temp = rf.predict(TestFeature)
testdata['Survived']=temp
outdata = testdata[['PassengerId','Survived']]#提取出需要的列
outdata.to_csv("test_2018_2_11.csv",index=False,header=True)#儲存資料集

搞定了,直接提交資料:0.73684,比預設的還差,暈倒了!
修改引數,改成100棵數,0.74162
加入PCA:0.56459

from sklearn.decomposition import PCA  
pca = PCA(n_components=4)
pca.fit(UseFeature)
UseFeature = pca.transform(UseFeature)

加入資料歸一化,0.73205

from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(UseFeature)
scaler.transform(UseFeature)

邏輯迴歸,0.75119

from sklearn.linear_model import LogisticRegression  
LC = LogisticRegression()
LC.fit(UseFeature,UseFlag)#進行模型的訓練  

SVM,0.75119

from sklearn import svm  
rf = svm.SVC(gamma=0.001, C=100.)  
rf.fit(UseFeature,UseFlag)#進行模型的訓練  

SVM RF LR加一起投票:0.76076
為什麼都這麼弱爆了……我需要靜靜……
ps:後來查詢了別人寫的文章,當時0.76還能排名到2000名左右的,說明本文的步驟和結果是沒有問題的,就是入門級別的最簡單的模型。

2018-2-12
使用了GBDT,發現GBDT很不錯,0.78947
然後SVM RF LR GBDT加一起投票:0.79425
今天機會用完了,好歹差不多2000名了,就這樣吧,不搞了:
這裡寫圖片描述