成立于2010年的Kaggle是一个进行数据发掘和预测竞赛的在线平台。与Kaggle合做以后,一家公司能够提供一些数据,进而提出一个问题,Kaggle网站上的计算机科学家和数学家,也就是如今所说的数据科学家,将受领任务,提供潜在的解决方案。html
重要的是,参与竞赛的这些科学家并不局限于一个答案,他们能够在截止日期以前修改本身的答案,进而推进本身和整个社区向着最佳答案不断进步。Kaggle联合创始人兼CEO安东尼·高德布卢姆(Anthony Goldbloom)解释说:“准确度不断提高,他们都倾向于同一个解决方案。”python
凡是玩数据科学和机器学习的老司机,有两个网站必定不会错过:GitHub 和 Kaggle。前者用来分享,后者进行实战练习。git
Ref: New to Data Science?正则表达式
Practice Skills算法
Variable | Definition | Key |
---|---|---|
survival | Survival | 0 = No, 1 = Yes |
pclass | Ticket class | 1 = 1st, 2 = 2nd, 3 = 3rd |
sex | Sex | |
Age | Age in years | |
sibsp | # of siblings / spouses aboard the Titanic | |
parch | # of parents / children aboard the Titanic | |
ticket | Ticket number | |
fare | Passenger fare | |
cabin | Cabin number | |
embarked | Port of Embarkation | C = Cherbourg, Q = Queenstown, S = Southampton |
From: http://www.cnblogs.com/cutd/p/5713520.htmlexpress
咱们都知道妇女和儿童更可能被救。所以,年龄
和性别
极可能更好的帮助咱们预测。数组
认为乘客的船层可能会影响结果也是符合逻辑的,由于第一层的船舱更靠近船的甲板。Fare
票价和乘客所住船层相关,并且多是高度相关的,可是也可能会增长一些额外的信息。网络
SibSp、Parch
兄弟姐妹、配偶、父母/孩子的数量极可能关系到是否被某一个或不少我的救,会有不少人去帮助你或者有不少人想到你尝试去救你。app
像Embarked
登船(也许有一些信息和怎么靠近船的顶部的人的船舱有关),Ticket
票号和Name
名字。dom
这一步一般是习得相关的领域知识[要对业务比较深刻],这对于绝大多数机器学习任务来讲很是很是很是的重要。
【特征的重要性有时候要超过模型的选择】
如下信息取自于:http://www.cnblogs.com/cutd/tag/kaggle/
读数据,清理数据。
>>> import pandas >>> import numpy >>> import matplotlib.pyplot >>> //读数据 >>> titanic = pandas.read_csv("train.csv") >>> //显示数据统计概况 >>> print(titanic.describe()) PassengerId Survived Pclass Age SibSp \ count 891.000000 891.000000 891.000000 714.000000 891.000000 mean 446.000000 0.383838 2.308642 29.699118 0.523008 std 257.353842 0.486592 0.836071 14.526497 1.102743 min 1.000000 0.000000 1.000000 0.420000 0.000000 25% 223.500000 0.000000 2.000000 20.125000 0.000000 50% 446.000000 0.000000 3.000000 28.000000 0.000000 75% 668.500000 1.000000 3.000000 38.000000 1.000000 max 891.000000 1.000000 3.000000 80.000000 8.000000 Parch Fare count 891.000000 891.000000 mean 0.381594 32.204208 std 0.806057 49.693429 min 0.000000 0.000000 25% 0.000000 7.910400 50% 0.000000 14.454200 75% 0.000000 31.000000 max 6.000000 512.329200 >>> //显示某一列 >>> titanic['Age'] 0 22.0 1 38.0 2 26.0 ... 888 NaN 889 26.0 890 32.0 Name: Age, dtype: float64 >>> //中值填充缺失值>>> //并赋值回原来的列 >>> titanic['Age'] = titanic['Age'].fillna(titanic['Age'].median()) >>> //非数值列变为数值形式 >>> titanic.loc[titanic['Sex']=='male','Sex'] = 0 >>> titanic.loc[titanic['Sex']=='female','Sex'] = 1 >>> //非数值列有哪几种 >>> print(titanic["Embarked"].unique()) ['S' 'C' 'Q' nan] >>> //缺失值使用最多的非数值类型填充 >>> 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
线性回归的等式以下:(y=mx+b)
仅使用age貌似就能达到还不错的效果。
预测
咱们可使用极好的 scikit-learn
库 来作预测:
# Import the linear regression class from sklearn.linear_model import LinearRegression # Sklearn also has a helper that makes it easy to do cross validation from sklearn.cross_validation import KFold # The columns we'll use to predict the target predictors = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"] # Initialize our algorithm class alg = LinearRegression() # Generate cross validation folds for the titanic dataset. It return the row indices corresponding to train and test. # We set random_state to ensure we get the same splits every time we run this. kf = KFold(titanic.shape[0], n_folds=3, random_state=1) predictions = [] for train, test in kf: # The predictors we're using the train the algorithm. Note how we only take the rows in the train folds. train_predictors = (titanic[predictors].iloc[train,:]) # The target we're using to train the algorithm. train_target = titanic["Survived"].iloc[train] # Training the algorithm using the predictors and target. alg.fit(train_predictors, train_target) # We can now make predictions on the test fold test_predictions = alg.predict(titanic[predictors].iloc[test,:]) predictions.append(test_predictions)
评价
定义偏差的度量标准。
从Kaggle竞赛的描述,偏差的度量标准是正确预测的百分比。咱们将使用这个相同的度量标准来测试咱们本地模型的性能。
这个度量标准将基本上是:
(
predictions
中找到的值 vs 他们在titanic['Survived']
的副本中准确对应的值的数量) / (乘客的总数)。
在咱们这么作以前,咱们须要先将三个预测数据集合并到一个列中。由于每个预测数据集是一个numpy(python科学计算库[注:真正的科学计算库应该是scipy,而numpy主要是矩阵数组等数据处理运算])数组,咱们可使用一个numpy方法将他们链接到一个列里。
算出predictions
预测值中和titanic["Survived"]
副本中准确相同的值的比例。这个计算结过应该是一个浮点数(小数)并将它赋值给变量accuracy
。
import numpy as np # The predictions are in three separate numpy arrays. Concatenate them into one. # We concatenate them on axis 0, as they only have one axis.
predictions = np.concatenate(predictions, axis=0) # Map predictions to outcomes (only possible outcomes are 1 and 0)
predictions[predictions > .5] = 1 predictions[predictions <=.5] = 0 accuracy = sum(predictions[predictions == titanic['Survived']])/(titanic['Survived'].count())
咱们有了咱们的第一个预测结果!但是结果并非很好,只有78.3%的正确率。在视频中,咱们曾提到一种方式使线性回归的输出值介于0
和1
之间。这种方法叫作逻辑回归。
一个好的方法就是将逻辑回归当成是线性回归的逻辑输出,因此他的值就是0
和1
。用逻辑函数 logit function来完成。输入任何值到逻辑函数都将经过“压缩”极值匹配成0
和1
。这对咱们来讲很是完美,由于咱们只关心两种输出结果。Sklearn
有一个逻辑回归的类咱们可使用。经过使用一个Sklearn
助手函数可使咱们全部的交叉验证和测试变得更简单。
Ref: 逻辑回归与线性回归的区别与联系
可是咱们须要提交一个答案到比赛中。咱们须要在测试数据上采起一个和训练数据上同样的校准的步骤来完成这个事情。
若是咱们没有校准操做,咱们就不可以利用它作出有效的预测。
这些操做要在咱们对列全部的改变以前进行。
处理titanic_test
和处理titanic
用一样的方法。
这涉及到:
titanic['Age'].median()
去找到中位数。Sex
列中的全部male
换成0
,全部female
换成1
。S
填充Embarked
列中的全部缺失值。将Embarked
列中的S
换成0
,C
换成1
,Q
换成2
。
咱们也须要将Fare
列的缺失值替换掉。用.fillna
将测试集中的缺失值用中位数替换掉。训练集中的Fare
列没有缺失值了,可是测试集有时会不一样。
其实就是一样的预处理,使数据都变得可处理、可操做。
titanic_test = pandas.read_csv("titanic_test.csv") titanic_test['Age'] = titanic_test['Age'].fillna(titanic_test['Age'].median()) titanic_test['Fare'] = titanic_test['Fare'].fillna(titanic_test['Fare'].median()) titanic_test.loc[titanic_test['Sex'] == 'male','Sex'] = 0 titanic_test.loc[titanic_test['Sex'] == 'female','Sex'] = 1 titanic_test['Embarked'] = titanic_test['Embarked'].fillna('S') titanic_test.loc[titanic_test['Embarked'] == 'S', 'Embarked'] = 0 titanic_test.loc[titanic_test['Embarked'] == 'C', 'Embarked'] = 1 titanic_test.loc[titanic_test['Embarked'] == 'Q', 'Embarked'] = 2
有了咱们须要生成一个比赛提交答案的全部东西以后,生成一个提交文件。
# Initialize the algorithm class
alg = LogisticRegression(random_state=1) # Train the algorithm using all the training data
alg.fit(titanic[predictors], titanic["Survived"]) # 1. # Make predictions using the test set.
predictions = alg.predict(titanic_test[predictors]) # 2. # Create a new dataframe with only the columns Kaggle wants from the dataset.
submission = pandas.DataFrame({ # 3. "PassengerId": titanic_test["PassengerId"], "Survived": predictions })
一旦你完成了上面步骤的代码,你就能用 submission.to_csv('kaggle.csv, index=False')
输出一个csv结果。
这将会给你的第一个条件全部须要的东西——虽然这没有给你很好的准确率。(~0.75)
因为咱们的预测在不一样的数据集上致使在测试集上的分数低于咱们在交叉验证上的分数。
在下一个任务中咱们将学习如何生成更好的特征和使用更好的模型来提升咱们的分数。
详见:http://www.cnblogs.com/cutd/p/5713525.html
经过求全部树的平均预测值,咱们能获得一个更好的总体预测和最小的过拟合。
感谢上帝,sklearn已经实现了一个很是棒的随机森林。(具体在python章节再详谈)
alg = RandomForestClassifier(random_state=1, n_estimators=10, min_samples_split=2, min_samples_leaf=1)
提升随机森林的精度:
min_samples_split
和min_samples_leaf
变量来减小过拟合。
生成新特征
使用pandas数据框的.apply
方法来生成新特征。
挖掘特征 - 头衔
咱们能够从乘客的名字中提取出他们的头衔。头衔的格式是Master.
,Mr.
,Mrs.
。有一些很是常见的头衔,也有一些“长尾理论”中的一次性头衔只有仅仅一个或者两个乘客使用。
Title
相对应的数值列。挖掘特征 - 家族
咱们也能够生成一个特征来表示哪些人是一个家族。由于幸存看起来很是依靠你的家族和你旁边的人,这是一个成为好特征的好机会。
为了完成这个任务,咱们将经过FamilySize
链接某些人的姓来获得一个家庭编号。而后咱们将基于他们的家庭编号给每一个人赋值一个代码。
在任何的机器学习任务中,特征工程都是最重要的部分,有许多的特征可让咱们计算。可是咱们也须要找到一种方法来计算出哪一个特征是最好的。
一种方法就是使用单特征选择器(univariate feature selection),这种方法的本质是一列一列的遍历计算出和咱们想要预测的结果(Survived
)最密切关联的那一列。
和之前同样,sklearn
有一个叫作SelectKBest
的函数 将会帮助咱们完成特征选择。这个函数会从数据中选出最好的特征,而且容许咱们指定选择的数量。
Goto: [Feature] Feature selection【更为详细】
另一种方法是以决策树为基础的梯度提高分类器。
提高包含了一个接一个的训练决策树,而且将一个树的偏差传入到下一棵树。因此每一颗树都是以它以前的全部树为基础构造的。
不过若是咱们建造太多的树会致使过拟合。
100
棵左右的树,这会很是容易过拟合和训练出数据集中的怪特征。25
。另一种防止过拟合的方法就是限制在梯度提高过程当中创建的每一棵树的深度。咱们将树的高度限制到3
来分避免过拟合。
咱们将试图用提高来替换掉咱们的随机森林方法而且观察是否会提高咱们的预测准确率。
为了提高咱们的预测准确率,咱们能作的一件事就是 集成不一样的分类器。集成的意思就是咱们利用一系列的分类器的信息来生成预测结果而不是仅仅用一个。在实践中,这意味着咱们是求他们预测结果的平均值。
一般来讲,咱们集成越多的越不一样的模型,咱们结果的准确率就会越高。多样性的意思是模型从不一样列生成结果,或者使用一个很是不一样的方法来生成预测结果。
一个关于集成的警示就是咱们使用的分类器的准确率必须都是差很少的。集成一个分类器的准确率比另一个差得多将会致使最后的结果也变差。
在这一节中,咱们将会集成基于大多数线性预测训练的逻辑回归(有一个线性排序,和Survived
有一些关联)和一个在全部预测元素上训练的梯度提高树。
在咱们集成的时候会保持事情的简单——咱们将会求咱们从分类器中获得的行几率(0~1)的平均值,而后假定全部大于0.5
的匹配成1
,小于等于0.5
的匹配成0
。
作两件事:
在测试集上匹配咱们的变化
在测试集上作预测
如今,咱们有了一个提交!这应该能让你在排行榜获得0.799
的分数。你可使用submission.to_csv("kaggle.csv",index=False)
生成一个提交文件。
你任然能够在特征工程上作不少事情:
在算法方面咱们也有很是多的事情能够作:
集成方法:
这个数据集很容易过拟合,由于没有不少的数据,因此你将会获得很小的准确率提高。
End.