kaggle-泰坦尼克预测

事实:船与冰山相撞后沉没,船上每个人没有足够的救生艇,导致2224人中1502人死亡。

要求:建立预测模型:使用乘客数据(姓名、年龄、性别、社会经济阶层等) 预测什么样的人更有可能生存

 

数据集:(姓名、年龄、性别、社会经济阶层等)

“Train.csv”:包含乘客子集的详细信息(891人),是基本事实,他们是否幸存

“Test.csv”:需要这个做自己的预测

步骤:从Train数据中找到模式,即机器学习模型,预测其他418名乘客(Test中有)是否幸存。

二分类问题。。。。。。

 

其中,性别和等级这些是特征,也可以使用特征工程来创建新特征。

survival: 1是活,0是没 pclass: 票的舱位  slibsp:同胞,兄弟姐妹及配偶 parch:父母/孩子 ticket:票号 fare:票价 cabin:客舱口(大量缺失值,不要了吧)   embarked:登船港口, C=瑟堡,Q=皇后镇,S=南安普顿

视频博主用jupyter演示的

 https://www.bilibili.com/video/BV1x4411L7jo?p=2

一个博主比较清晰的:

https://blog.csdn.net/qq_45425321/article/details/104760378?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-104760378-blog-102539278.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-104760378-blog-102539278.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=1

注:我的jupyter打开方式

 

 

 

 

1.数据预处理:

pandas库做数据分析和处理的,导入数据,赋给taitanic变量

import pandas
taitanic = pandas.read_csv("train.csv")
titannic.head()  ##可以打印数据的前几行,以供查看,()默认是5行,(3)是3行
print taitanic.describe() #按列看整体统计,std是方差

   注:age列中只有714个数据,有缺失值,   方法:用中位数填充 fillna缺失值

taitanic["Age"]=taitanic["Age"].fillna(taitanic["Age"].median()) #填充
print taitanic.describe()     #重新显示

   注:sex列,性别字符转数字 用loc定位 (机器学习不能处理字符值)

print taitanic["Sex"].unique()      ##查看不重复的有几种可能性

#替换:男是0,女是1
taitanic.loc[taitanic["Sex"]=="male","Sex"]=0
taitanic.loc[taitanic["Sex"]=="female","Sex"]=1

#登船地点做相同变换
print taitanic["Embarked"].unique()
taitanic["Embarked"]=taitanic["Embarked"].fillna('S') #用众数填充
taitanic.loc[taitanic["Embarked"]=="S","Embarked"]=0
taitanic.loc[taitanic["Embarked"]=="C","Embarked"]=1
taitanic.loc[taitanic["Embarked"]=="Q","Embarked"]=2

 

开始二分类!!(最简单的线性回归开始

 验证集调整参数,即将train训练数据集分成三份,三份进行交叉验证(12做样本训练,3号做验证; 13做训练测试,2号做验证。。最后有三个准确率,最后进行平均化,衡量模型的好坏)

 

from sklearn.linear_model import LinearRegression  #引入线性回归库
from sklearn.model_selection import KFold      #引入交叉验证库

#对处理好的数据进行线性回归
predictors=["Pclass","Sex","Age","SibSp","Parch","Fare","Embarked"]   ##2.选择数据特征进行预测

alg = LinearRegression() #3.选择算法:导入线性回归,赋给alg变量
kf = KFold(n_splits=3) #taitanic.shape返回的是m*n,这个意思是从m个人里做三层交叉验证
#三次循环做三次交叉验证,每次循环进行一次回归
4.多层交叉验证
predictions = [] #先建着,用来以后存train中test得出的结论
for train,test in kf:
  train_predictors = (taitanic[predictors].iloc[train,:]) #将train中的训练集取出来
  train_target = taitanic["Survive"].ilon[train] #对应的真实label
  #进行线性回归
  alg.fit(train_predictors,train_target) #训练回归模型

  test_predictions = alg.predict(taitanic[predictors].iloc[test,:])
  predictions.append(test_predictions) #将预测出来的加进来
  
机器学习步骤完成,线性回归得出来的是0-1上的值

查看train中的效果:

#先进行分类吧,大于0.5的=1,小于0.5的=0
import numpy as np
predictions = np.concatenate(predictions,axis=0)  #本来是三个里面的,现在合成一个
predictions[predictions>.5]=1
predictions[predictions<.5]=0

#求分类的准确率
accuracy = sum(predictions == taitanic["Survived"]) / len(preditions)
print(accuracy)   #0.78

  

#上面的线性回归得出来的结果是0-1,还要分类

寻找直接能归于哪一类的概率是多少?

逻辑回归来了!

from sklearn import cross_validation  #k 折交叉验证,切三份每份轮流当验证
from sklearn.linear_model import LogisticRegression #引入逻辑回归

alg= LogisticRegression()
scores=cross_validation.cross_val_score(alg,taitanic[predictors],taitanic["Survived"],cv=3)
print(scores)           #[0.78451178 0.78787879 0.79124579]
print(scores.mean())         #0.7878787878787877
 

 

随机森林:有放回随机选测试样本,随机选特征(防止过拟合)

由多个决策树进行分类,最后取多个决策树的平均或者投票

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
alg=RandomForestClassifier(n_estimators=50,min_samples_split=2,min_samples_leaf=1)  #决策树的个数,决策树分裂停止条件(样本个数、叶子节点个数)
kf=KFold(n_splits=3)
scores=cross_val_score(alg,taitanic[predictors],taitanic["Survived"],cv=kf)
print(scores.mean())     #0.79

 当决策数个数增加至100个时,发现准确率提升不大,达到了准确率瓶颈,想要继续优化,此时就回归数据本身。影响分类器最多的还是输入数据本身。刚才输入特征有限,接下来构造新特征,比如:家庭成员+名字长度。

 

posted @ 2022-02-25 20:37  Hello-Vivi  阅读(105)  评论(0)    收藏  举报