任务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(rC:Users	anhaDesktop机器学习	rain.csv)
  3 test = pd.read_csv(rC: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(rC: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,泰坦尼克号的主要内容,如果未能解决你的问题,请参考以下文章

题解 P1280 尼克的任务

尼克的任务

tyvj1034 尼克的任务

尼克的任务题解

P1280 尼克的任务

P1280 尼克的任务