任务8,泰坦尼克号
Posted tann
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任务8,泰坦尼克号相关的知识,希望对你有一定的参考价值。
按老师给的代码第一次提交得分
下面进行改进
一, 首先进行数据的清洗
先观察数据,首选‘Pclass‘,‘Sex‘,‘Age‘作为是否生还(Survived)的 考虑条件来建模
“Sex”的数值是字符型,于是用特征编码将性别用0,1表示
随后发现”Age”中有缺少值,由于age是数值量,可以直接使用,那么在”Age”的缺失值处理中,可以采用的是删除法,和填补法。
(一, 删除法)
(二, 填补法)
(1) 用0填补
(因为该属性是年龄,用0填补可能误差比较大)
老师给的代码中就是用0填补
得分为0.69856
(2) 用平均值填补
将Age的缺失值由0改为该列的平均值后得分为0.70813
(默认K=5)
(3) 用中位数填补
将Age的缺失值由0改为该列的中位数后得分为0.60765
(默认K=5)
说明在本题中使用平均值比用0和中位数更好,于是在下面的尝试中都是采用Age缺少值填补为平均值的方法
二,训练KNN模型,以及用KNN模型做预测
(KNN的K值默认是5,得分为0.70813)
通过K折交叉验证来选择KNN模型中的K值
——查了资料发现,K折交叉验证的K的取值没有一定的要求,现在较流行的是十折交叉验证和留一法。
(1) 5折交叉验证后best_k值为1,把K值改为1后,发现得分比K值为5小
(2) 留一法后,得到best_k为13
结果更低了,再试十折交叉验证
(3) 十折验证法后得到best_k=7
虽然比留一法的高,但是没有当K等于5时高,为什么K折交叉验证法不能找出最优的K值呢?
三,再加一个属性“Embarked”上船城市
考虑到上船城市不同可能会影响结果,于是加入该特征
由于只有两个缺失值,于是直接把缺失值赋为“S”
结果分数更高了,说明上船城市不同会影响结果
在看博客时发现有人用KNN算法时K取3,于是我又在上述的基础上把K改为3,分数更高了
总结:
(1) 在分析数据时没有做到把数据可视化来观察,而是凭感觉选出“年龄性别舱位等级”这些特征来拟合模型。
(2) “Age”的缺失值用平均数比用中位数好。
(3) “Embarked”上船城市对 是否生还 有影响。
(4) 在我这几次的测试里,得到KNN算法中n_neighbors取3值得分最高。
(5) 得出的表格第一列是序号,暂时没找到删除它的方法,如果直接提交是不行的,我的办法是手动删除第一列
(6) 有一个问题没有想明白,为什么K折交叉验证法得出的best_k K值得分不是最高的???
最后上代码
1 import pandas as pd 2 train = pd.read_csv(r‘C:Users anhaDesktop机器学习 rain.csv‘) 3 test = pd.read_csv(r‘C:Users anhaDesktop机器学习 est.csv‘) 4 print(train) 5 6 traindata = train[[‘Pclass‘,‘Sex‘,‘Age‘,‘Embarked‘]].copy() 7 #trainlabel = pd.Series(train[‘Survived‘]) 8 trainlabel = train[‘Survived‘].copy()#目标值 9 #为何要.copy()? https://www.jianshu.com/p/72274ccb647a 10 11 #对性别以0-1取代,male-1,female-0 12 traindata.loc[traindata.Sex ==‘female‘, ‘Sex‘] = 0 13 traindata.loc[traindata.Sex ==‘male‘, ‘Sex‘] = 1 14 #对城市也同样用0,1,2取代S,C,Q 15 traindata.loc[traindata.Embarked ==‘S‘, ‘Embarked‘] = 0 16 traindata.loc[traindata.Embarked ==‘C‘, ‘Embarked‘] = 1 17 traindata.loc[traindata.Embarked ==‘Q‘, ‘Embarked‘] = 2 18 19 #查看缺失值情况 20 traindata.info() 21 22 #显示Age的缺失值 23 traindata[traindata.Age.isnull()] 24 #显示Embarked的缺失值 25 traindata[traindata.Embarked.isnull()] 26 27 #填充Age的缺失值为0时 28 #traindata.loc[traindata.Age.isnull(), ‘Age‘] = 0 29 #填充Age的缺失值为该列平均值mean() 30 #中位数median() 31 print(traindata.Age.mean()) 32 traindata.loc[traindata.Age.isnull(), ‘Age‘] = traindata.Age.fillna(round(traindata.Age.mean(),1)) 33 #填充Embarked的缺失值为0,s 34 traindata.loc[traindata.Embarked.isnull(), ‘Embarked‘] = 0 35 traindata.head(10) 36 37 from sklearn.model_selection import train_test_split 38 train_data, test_data, train_label, test_label = train_test_split(traindata, trainlabel, random_state=7, test_size=0.3 ) 39 print(len(train_data), len(test_data),len(train_label)) 40 type(train_data) 41 type(train_label) 42 43 #选出一个K的值 44 #把训练集分为训练数据和验证数据 45 import numpy as np 46 from sklearn.model_selection import KFold 47 from sklearn.neighbors import KNeighborsClassifier 48 49 X = np.array(traindata[[‘Pclass‘, ‘Sex‘, ‘Age‘,‘Embarked‘]]) 50 #y = np.array(trainlabel[‘Survived‘]) 51 y = trainlabel.values.ravel() 52 #已经把X,y化为列表 53 54 kf = KFold(n_splits=891,shuffle=True) #如果要使用留一法交叉验证,那n_splits=样本数量 55 56 ks = [1,3,5,7,9,11,13,15,17,19,20] 57 58 best_k = ks[0] 59 best_score = 0 60 61 for k in ks: 62 curr_score = 0 63 64 for train_index, valid_index in kf.split(X): 65 clf = KNeighborsClassifier(n_neighbors=k) 66 clf.fit(X[train_index], y[train_index]) 67 curr_score += clf.score(X[valid_index], y[valid_index]) 68 69 avg_score = curr_score/891 #前面n_splits=5,5折交叉验证 70 71 if avg_score>best_score: 72 best_score = avg_score 73 best_k = k 74 print("current best score is: %.2f"%best_score, "best k: %d"%best_k) 75 76 print("after cross validtion, the final best k is: %d"%best_k) 77 78 from sklearn.neighbors import KNeighborsClassifier 79 clf = KNeighborsClassifier(n_neighbors=3) 80 clf.fit(traindata, trainlabel) 81 pred = clf.predict(test_data) 82 from sklearn.metrics import accuracy_score 83 accuracy_score(pred, test_label) 84 85 testdata = test[[‘Pclass‘,‘Sex‘,‘Age‘,‘Embarked‘]].copy() 86 #对性别以0-1取代,male-1,female-0 87 testdata.loc[testdata.Sex ==‘female‘, ‘Sex‘] = 0 88 testdata.loc[testdata.Sex ==‘male‘, ‘Sex‘] = 1 89 90 testdata.loc[testdata.Embarked ==‘S‘, ‘Embarked‘] = 0 91 testdata.loc[testdata.Embarked ==‘C‘, ‘Embarked‘] = 1 92 testdata.loc[testdata.Embarked ==‘Q‘, ‘Embarked‘] = 2 93 94 #查看缺失值情况 95 testdata.info() 96 #显示Age的缺失值 97 testdata[testdata.Age.isnull()] 98 99 #填充Embarked的缺失值为0 100 testdata.loc[testdata.Embarked.isnull(), ‘Embarked‘] = 0 101 102 #填充Age的缺失值为该列平均值 103 testdata.loc[testdata.Age.isnull(), ‘Age‘] = testdata.Age.fillna(round(testdata.Age.mean(),1)) 104 testdata.head(100) 105 106 import numpy as np 107 result0 = clf.predict(testdata) 108 index = test[‘PassengerId‘] 109 sumission = pd.DataFrame({‘PassengerId‘:test[‘PassengerId‘].values,‘Survived‘:result0.astype(np.int32)}) 110 111 sumission[‘Survived‘] = result0 112 sumission = sumission.reset_index(drop=True) 113 sumission.to_csv(r‘C:Users anhaDesktop机器学习submission6.csv‘)
参考博客:
python 分析泰坦尼克号生还率(数据可视化很清晰)
https://blog.csdn.net/sixkery/article/details/83239375
用Python随机森林预测泰坦尼克号生存情况
https://www.cnblogs.com/annebang/p/8731300.html
Kaggle泰坦尼克数据科学解决方案
https://www.cnblogs.com/zackstang/p/8185531.html
GridSearchCV,CV调优超参数使用】【K最近邻分类器 KNeighborsClassifier 使用】【交叉验证】
https://blog.csdn.net/feifei_csdn/article/details/84103071
以上是关于任务8,泰坦尼克号的主要内容,如果未能解决你的问题,请参考以下文章