我们在训练我们的算法时要么必须排除这些非数值列( Name , Sex , Cabin , Embarked , Ticket ),要么就要找到一种方法将他们转换成数值列。
我们将忽略 Ticket , Cabin , Name 这三行。因为我们不能从他们中提取出太多有用的信息。 Cabin 列大多数值都是缺失的(891行中只有204行数值),而且起初看起来好像也不是特别有用的列。如果没有一些关于船票号码意义的专业领域知识和哪些名字的特点像大户或者有钱家庭,那么 Ticket 和 Name 列也不太可能会告诉我们太多的信息。
5:转换性别 Sex 列
性别列是非数值的,但是我们想把它保留——他可能非常有用。我们将每一个性别用数值码替换将其转换成一个数值列。之后机器学习算法能够使用这些类别去做预测。
为了完成这个目的,我们首先要找出列中所有的唯一性别(我们知道有male男和female女,但是有没有可能谁在数据集用的是其他缺失值代码呢?)。我们将0赋值给male,将1赋值给female。
我们可以选择 Sex 列的所有值为male的行并且用0替换male:
titanic.loc[titanic['Sex']=='male','Sex'] = 0
titanic.loc[titanic['Sex']=='female','Sex'] = 1
# 有一个问题就是我自己测试的时候,describe()方法还是不显示性别。
6:转换登船 Embarked 列
我们现在可以用和转换 Sex 列相同的方法将 Embarked 列转换成数值码。 Embarked 列的唯一值是 S,C,Q 和缺失值 nan 。每个字母是一个登船港口名字的缩写。
第一步是替换列中的缺失值。大部分共同的登船港口都是 S ,所以我们假设每个人都是从那儿上船的。将 Embarked 列的缺失值全都替换成 S 。
我们分别将 0 赋值给 S ,将 1 赋值给 C ,将 2 赋值给 Q ,替换每个值相应的代码:
# Find all the unique values for "Embarked".
print(titanic["Embarked"].unique())
titanic['Embarked'] = titanic['Embarked'].fillna('S')
titanic.loc[titanic['Embarked'] == 'S', 'Embarked'] = 0
titanic.loc[titanic['Embarked'] == 'C', 'Embarked'] = 1
titanic.loc[titanic['Embarked'] == 'Q', 'Embarked'] = 2
7:交给机器学习
现在我们的数据已经清洗得干净了一点了,我们准备开始探索一些机器学习。我们开始的一些行数据看起来像这样:
Age |Sex |Survived
----|----|--------
10 | 0 |0
5 | 1 |1
30 | 0 |0
如果我们想利用 Age 列的数据来预测是否有人幸存或者没有幸存,我们可以使用一种叫做线性回归的方法。线性回归的等式如下:(y=mx+b), y 的值是我们设法预测的, m 是一个叫做斜率的系数, x 是一列的值, b 是一个叫做截距的常数。
我们可以通过赋值 -2 给 m ,赋值 20 给 b 做一个预测。我们得到这样的结果:
AgeSexSurvivedPredictions1000-2*10+20=0511-2*5+20=103000-2*30+20=-40如果我们将得到的预测结果中任何大于0的值转换成1,任何小于等于0的值换成0,我们将得到这样的结果:
AgeSexSurvivedPredictions10000511130000这个简单的模型预测幸存者相当好。线性模型可以是一个非常强大的算法,但是也有一些缺点:
如果一个列和一个结果不是线性相关,这就不会有好的效果。例如:如果除了80岁以上的老年女性也不幸存,那么线性回归将不会有好效果。
它不能给你幸存率,只有具体的数值来表明某人是否幸存。
我们之后会讨论如何处理这两个问题。现在,我们将学习如何自动的计算线性回归的回归系数,如何用多列数据来预测一个结果。
8:交叉验证
我们现在使用线性回归在我们的训练数据集上做预测。
我们想用除我们做预测之外的不同的数据来训练算法。如果我们想避免过拟合这是非常关键的。过拟合是当一个模型拟合它本身过于复杂,不显著。每个数据都有其独有的特点且不存在于全集。例如:如果我要求你利用一辆车的马力和其他特征,并且给你一个随机的非常高的最高速度数据集,来预测一辆车的最高速度,你将会建立一个速度过高的模型。解决的办法就是用你没有用来训练模型的数据去测试性能。
每一个机器学习算法都可以过拟合,即使有的(像线性回归)非常不容易。如果你测试(评估)你的算法和你训练算法是用的同一个数据集,那么你很可能不知道它的性能好到底是算法很好还是因为过拟合它自己的噪声。