快捷搜索:  汽车  科技

经典预测算法(泰坦尼获救预测分析)

经典预测算法(泰坦尼获救预测分析)titanic['Age']=titanic['Age'].fillna(titanic['Age'].median())第五步,填充缺失值,不取最大值也不取最小值,可以使用均值来填充,运行之后,可以得到如下结果按照每列字段数据统计结果可以看到Age数据是有缺失的。这里可以查看数据源检查可见,Age列确实是有缺失值。

  • 第一步,在kaggle官网下载<泰坦尼获救预测分析案例>数据

  • 第二步,浏览器打开Jupter,选择python

  • 第三步,上传<泰坦尼获救预测分析案例>数据

经典预测算法(泰坦尼获救预测分析)(1)


第四步,数据预处理。即读取数据,然后用.describe()看看汇总的数据,代码如下:

import pandas

titanic=pandas.read_csv("train.csv")

titanic.describe()

运行之后,可以得到如下结果

经典预测算法(泰坦尼获救预测分析)(2)

按照每列字段数据统计结果可以看到Age数据是有缺失的。这里可以查看数据源检查

经典预测算法(泰坦尼获救预测分析)(3)

可见,Age列确实是有缺失值。


第五步,填充缺失值,不取最大值也不取最小值,可以使用均值来填充,

titanic['Age']=titanic['Age'].fillna(titanic['Age'].median())

titanic.describe()

#titanic['Age'].median(),这是取表里,Age列的中位数

#fillna(titanic['Age'].median()),用Age列的中位数的中位数来填充

#titanic['Age'].fillna(titanic['Age'].median()),用Age列的中位数的中位数来填充Age列中的空值

完成填充之后,输出数据显示如下图,可见填充之后Age列不再有空值,

经典预测算法(泰坦尼获救预测分析)(4)


第六步,处理把字符型数据,转换成数值型的。原因机器算法不能处理字符型,转为数值型就可以做算法分类。可以看到数据源中,性别sex列是字符。我们可以把male赋值为0。female赋值为1。

经典预测算法(泰坦尼获救预测分析)(5)

titanic.loc[titanic['Sex']=='male' 'Sex']=0,#用0替代male

titanic.loc[titanic['Sex']=='female' 'Sex']=1,#用1替代female

print(titanic['Sex'].unique()),#显示Sex列里面的唯一值

运行效果如下:

经典预测算法(泰坦尼获救预测分析)(6)

同样的,把Embarked(登船点)列字符S、C、Q依次改为0、1、2

在此之前,可以先检查一下该列的唯一值是什么

经典预测算法(泰坦尼获救预测分析)(7)

运行结果中看到nan,代表空值,因此,我们可以先用其他点填充,这里也可以先统计S、C、Q三个点谁多一些,我们可以选择多的那个点来填充。

经典预测算法(泰坦尼获救预测分析)(8)

由以上统计结果可以看到S点登船的人数最多,所以,我们把登船点缺失的都填充为S。填充完成之后,统计发现S只是增加了2个,说明数据只是缺少了2个。

经典预测算法(泰坦尼获救预测分析)(9)

也可以再打印该列的唯一值,可以看到已经没有缺失值了。

经典预测算法(泰坦尼获救预测分析)(10)

下面我们把Embarked(登船点)列字符S、C、Q依次改为0、1、2。先赋值,再打印唯一值,可以看到已经成功替换了字符。

经典预测算法(泰坦尼获救预测分析)(11)

我们的目的的预测被获救还是没有被获救。0代表没有获救、1代表获救成功。

经典预测算法(泰坦尼获救预测分析)(12)


第七步,选取特征指标,选择算法,预测

1、选择回归模型预测

1)线性回归,拟合。

经典预测算法(泰坦尼获救预测分析)(13)

这个代码运行一次结果差的离谱,运行第二次直接报错。问题在哪呢?

2)逻辑回归,一般用来做分类,这里同样的使用了cross_val_score做交叉验证。运行结果如下

经典预测算法(泰坦尼获救预测分析)(14)

运行结果看到0.79……不是很理想,精度不够高,效果不太好。

3)下面选择高级一点的算法——随机森林

from sklearn import model_selection

from sklearn.ensemble import RandomForestClassifier,这里调用随机森林

predictors=['Pclass' 'Sex' 'Age' 'SibSp' 'Parch' 'Fare' 'Embarked'],这里选取可能影响获救的几个参数

alg=RandomForestClassifier(random_state=1 n_estimators=10 min_samples_split=2 min_samples_leaf=1),这里数字10代表10棵决策树,数字2、1用来控制决策树分裂停止的条件。

kf=model_selection.KFold(n_splits=3 shuffle=True random_state=1)

scroes=model_selection.cross_val_score(alg titanic[predictors] titanic['Survived'] cv=kf)

#这里同样用3次了交叉验证

print(scores.mean())#打印预测精度

以上代码运行结果如下:

经典预测算法(泰坦尼获救预测分析)(15)

可以看到精度和回归模型预测的结果一样,接下来,我们可以调整决策树的参数等,看看预测精度。

修改了决策树为100棵,停止分裂参数分别为4,2。精度没有更改。还是一样?为啥?求解??

经典预测算法(泰坦尼获救预测分析)(16)

2、特征选择

我们在原来的特征基础上,加上兄弟姐妹个数['Sibsp],带幼儿或者老人个数['Parch'],身份['Mr Miss Dr……'],名词长度等特征。看看预测准确率是否能高一些。

#添加以下两个特征:

titanic['FamilySize']=titanic['SibSp'] titanic['Parch']

titanic['NameLength']=titanic['Name'].apply(lambda x: len(x))

#把名字里的身份转换为数字

import re

def get_Title(name):

title_search=re.search('([A-Za-z] )\.' name)

if title_search:

return title_search.group(1)

return ''

titles=titanic['Name'].apply(get_title)

print(pandas.value_counts(titles))

title_mapping={'Mr':1 'Miss':2 'Mrs':3 'Master':4 'Dr':5 'Rev':6 'Major':7 'Col':7 'Mlle':8 'Mme':8 'Don':9 'Lady':10 'Countess':10 'Jonkheer':10 'Sir':9 'Capt':7 'Ms':2}

for k v in title_mapping.items():

titles[titles==k]=v

print(pandas.value_counts(titles))

titanic['Title']=titles

运行结果如下:

经典预测算法(泰坦尼获救预测分析)(17)

对特征绘图,看看哪个特征最显著

import numpy as np

from sklearn.feature_selection import SelectKBest f_classif

import matplotlib.pyplot as plt

predictors=['Pclass' 'Sex' 'Age' 'SibSp' 'Parch' 'Fare' 'Embarked' 'FamilySize' 'Title' 'NameLength']

selector=SelectKBest(f_classif k=5)

selector.fit(titanic[predictors] titanic['Survived'])

sores=-np.log10(selector.pvalues_)

plt.bar(range(len(predictors)) scores)

plt.xticks(range(len(predictors)) predictors rotation='vertical')

plt.show()

predictors=['Pclass' 'Sex' 'Fare' 'Title']

alg=RandomForestClassifier(random_state=1 n_estimators=50 min_samples_split=8 min_samples_leaf=4)

运行结果???图出不来???

跟着视频学做的结果就是一脸懵逼,麻烦大家帮我找找问题,谢谢。

猜您喜欢: