经典预测算法(泰坦尼获救预测分析)
经典预测算法(泰坦尼获救预测分析)titanic['Age']=titanic['Age'].fillna(titanic['Age'].median())第五步,填充缺失值,不取最大值也不取最小值,可以使用均值来填充,运行之后,可以得到如下结果按照每列字段数据统计结果可以看到Age数据是有缺失的。这里可以查看数据源检查可见,Age列确实是有缺失值。
- 第一步,在kaggle官网下载<泰坦尼获救预测分析案例>数据
- 第二步,浏览器打开Jupter,选择python
- 第三步,上传<泰坦尼获救预测分析案例>数据
第四步,数据预处理。即读取数据,然后用.describe()看看汇总的数据,代码如下:
import pandas
titanic=pandas.read_csv("train.csv")
titanic.describe()
运行之后,可以得到如下结果
按照每列字段数据统计结果可以看到Age数据是有缺失的。这里可以查看数据源检查
可见,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列不再有空值,
第六步,处理把字符型数据,转换成数值型的。原因机器算法不能处理字符型,转为数值型就可以做算法分类。可以看到数据源中,性别sex列是字符。我们可以把male赋值为0。female赋值为1。
titanic.loc[titanic['Sex']=='male' 'Sex']=0,#用0替代male
titanic.loc[titanic['Sex']=='female' 'Sex']=1,#用1替代female
print(titanic['Sex'].unique()),#显示Sex列里面的唯一值
运行效果如下:
同样的,把Embarked(登船点)列字符S、C、Q依次改为0、1、2
在此之前,可以先检查一下该列的唯一值是什么
运行结果中看到nan,代表空值,因此,我们可以先用其他点填充,这里也可以先统计S、C、Q三个点谁多一些,我们可以选择多的那个点来填充。
由以上统计结果可以看到S点登船的人数最多,所以,我们把登船点缺失的都填充为S。填充完成之后,统计发现S只是增加了2个,说明数据只是缺少了2个。
也可以再打印该列的唯一值,可以看到已经没有缺失值了。
下面我们把Embarked(登船点)列字符S、C、Q依次改为0、1、2。先赋值,再打印唯一值,可以看到已经成功替换了字符。
我们的目的的预测被获救还是没有被获救。0代表没有获救、1代表获救成功。
第七步,选取特征指标,选择算法,预测
1、选择回归模型预测
1)线性回归,拟合。
这个代码运行一次结果差的离谱,运行第二次直接报错。问题在哪呢?
2)逻辑回归,一般用来做分类,这里同样的使用了cross_val_score做交叉验证。运行结果如下
运行结果看到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())#打印预测精度
以上代码运行结果如下:
可以看到精度和回归模型预测的结果一样,接下来,我们可以调整决策树的参数等,看看预测精度。
修改了决策树为100棵,停止分裂参数分别为4,2。精度没有更改。还是一样?为啥?求解??
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
运行结果如下:
对特征绘图,看看哪个特征最显著
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)
运行结果???图出不来???
跟着视频学做的结果就是一脸懵逼,麻烦大家帮我找找问题,谢谢。