0.说在前面
1.数据预处理
2.特征选择
3.模型选择
4.结果上传
5.总结
6.作者的话
昨天写了一篇有关leetcode刷题的文章,今天接着上次的kaggle,进行特征选择,模型选择等的一系列步骤。 关于进群交流的伙伴,可以点击公众号右下角联系我,备注leetcode,进算法群;备注总群,进交流总群!
这里放上上一节(泰坦尼克号之生存预测(1))的地址:
https://mp.weixin.qq.com/s/7pR1wqPaRl6RGApblJ-fJA
【客舱号与生存】
Cabin表示客舱号。
首先我们来对数据缺失值,进行填充。
将缺失值设为NA
X_train['Cabin'] = X_train['Cabin'].fillna('NA')
X_test['Cabin'] = X_test['Cabin'].fillna('NA')
其次定义一个方法:
用于获取客舱号的第一个字母或数字
def Cabin_First_Letter(x):
if x == 'NA':
return 'NA'
return x[0]
将交叉验证集数据进行上述方法操作
sns.barplot('Cabin_First_Letter', 'Survived', data=X_train.sort_values('Cabin_First_Letter'), ax=axis1)
X_train['Cabin_First_Letter'] = X_train['Cabin'].apply(Cabin_First_Letter)
X_test['Cabin_First_Letter'] = X_test['Cabin'].apply(Cabin_First_Letter)
统计客舱号中第一个字母的出现次数:
X_train.groupby('Cabin_First_Letter')['Survived'].count()
结果:
Cabin_First_Letter
A 12
B 28
C 41
D 21
E 22
F 8
G 3
NA 488
Name: Survived, dtype: int64
接着,数据处理完了,我们是时候可视化数据,并确定该特征值与生存的关系!
fig, (axis1,axis2) = plt.subplots(1,2,figsize=(15,5))
sns.barplot('Cabin_First_Letter', 'Survived', data=X_train.sort_values('Cabin_First_Letter'), ax=axis1)
sns.barplot('Cabin_First_Letter', 'Survived', data=X_test.sort_values('Cabin_First_Letter'), ax=axis2)
这里采用seaborn的barplot绘制柱状图,图中的竖线代表误差棒!图显示的是每一个客舱号第一位数字或字母出现的集中分布趋势!
针对上述这个图,我们得出如下结论:
存活率排序:E>D>>B>C>A>.....
然后定义一个方法,进行封装,依次返回数值!
def Cabin_First_Letter_Code(x):
if x == 'E':
return 1
if x == 'D':
return 2
if x == 'B':
return 3
if x == 'C':
return 4
if x == 'A':
return 5
return 6
然后根据上述的交叉验证数据集的结果,应用到我们的测试集与训练集上。
tannike_train['Cabin'] = tannike_train['Cabin'].fillna('NA')
tannike_test['Cabin'] = tannike_test['Cabin'].fillna('NA')
tannike_train['Cabin_First_Letter'] = tannike_train['Cabin'].apply(Cabin_First_Letter)
tannike_test['Cabin_First_Letter'] = tannike_test['Cabin'].apply(Cabin_First_Letter)
由于当前研究的这个数据为等级资料数据,我们这里用one-hot编码可有效的处理问题:
tannike_train['Cabin_First_Letter'] = tannike_train['Cabin_First_Letter'].apply(Cabin_First_Letter_Code)
tannike_test['Cabin_First_Letter'] = tannike_test['Cabin_First_Letter'].apply(Cabin_First_Letter_Code)
tannike_train = pd.get_dummies(columns = ['Cabin_First_Letter'], data = tannike_train)
tannike_test = pd.get_dummies(columns = ['Cabin_First_Letter'], data = tannike_test)
【登陆港口与生存】
由于登录港口数据已经在前一节的缺失值处理掉了,这里便可以直接对交叉验证集数据可视化:
fig, (axis1,axis2) = plt.subplots(1,2,figsize=(15,5))
sns.barplot('Embarked', 'Survived', data=X_train.sort_values('Embarked'), ax=axis1)
sns.barplot('Embarked', 'Survived', data=X_test.sort_values('Embarked'), ax=axis2)
然后我们对其进行生存排序:
C>Q>S
由于只有三类,直接对训练集与测试集进行one-hot编码即可!
tannike_train = pd.get_dummies(tannike_train,columns = ['Embarked'])
tannike_test = pd.get_dummies(tannike_test,columns = ['Embarked'])
Pclass 客舱等级(1/2/3等舱位) 同Embarked操作,这个就不阐述了!
【兄弟姐妹与生存】
SibSp 兄弟姐妹数或配偶数
Parch 父母数或子女数
将其与Parch 合并处理!
X_train['Fam_Size'] = X_train['SibSp'] + X_train['Parch']
X_test['Fam_Size'] = X_test['SibSp'] + X_test['Parch']
可视化:
fig, (axis1,axis2) = plt.subplots(1,2,figsize=(15,5))
sns.barplot('Fam_Size', 'Survived', data=X_train.sort_values('Parch'), ax=axis1)
sns.barplot('Fam_Size', 'Survived', data=X_test.sort_values('Parch'), ax=axis2)
特征处理:
分为三类:Solo,Nuclear,Big,并对训练集与测试集进行one-hot编码!
import numpy as np
def Family_feature(train, test):
for i in [train, test]:
i['Fam_Size'] = np.where((i['SibSp']+i['Parch']) == 0 , 'Solo',
np.where((i['SibSp']+i['Parch']) <= 3,'Nuclear', 'Big'))
del i['SibSp']
del i['Parch']
return train, test
tannike_train, tannike_test = Family_feature(tannike_train, tannike_test)
tannike_train = pd.get_dummies(tannike_train,columns = ['Fam_Size'])
tannike_test = pd.get_dummies(tannike_test,columns = ['Fam_Size'])
Fare同理操作!
这里以全集特征训练!删除某一特征训练结果测试,后续~~
X_train_ = tannike_train.loc[X_train.index]
X_test_ = tannike_train.loc[X_test.index]
Y_train_ = label.loc[X_train.index]
Y_test_ = label.loc[X_test.index]
X_test_.head(3)
X_test_ = X_test_[X_train_.columns]
X_test_.head(3)
tannike_test = tannike_test[tannike_train.columns]
tannike_test.head()
【xgboost】
这里选用xgboost进行测试,下面是选择的最优情况的代码,线下测试:0.8097014925373134,线上测试0.80621!
import xgboost as xgb
from sklearn.preprocessing import LabelEncoder
gbm = xgb.XGBClassifier(max_depth=3, n_estimators=300, learning_rate=0.06,scoring='r3', cv=10, verbose=1, n_jobs=4,)
gbm.fit(X_train_, Y_train_)
gbm.score(X_test_,Y_test_)
【随机森林】
线下测试:0.8022388059701493,线上测试0.80621!
rf_ = RandomForestClassifier(random_state = 10, warm_start = True,
n_estimators = 900,
max_depth = 6,
max_features = 'sqrt',min_samples_leaf=1)
rf_.fit(X_train_, Y_train_)
rf_.score(X_test_,Y_test_)
首先通过上述建立的模型进行预测,并输出到上传文件中,然后再上传 !
s = pd.read_csv('./gender_submission.csv')
predictions = p.predict(tannike_test) # p为模型分类器
submission = pd.DataFrame({"PassengerId": s.PassengerId, "Survived": predictions.astype(np.int32)})
submission.to_csv("submission-pipe.csv", index=False)
学习参考
https://www.kesci.com/home/project/5af18c294b7639369e6c289c