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

浙公网安备 33010602011771号