机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
作者:寒小阳
Kaggle入门:逻辑回归应用之Kaggle泰坦尼克之灾
作者:EvanLi
Kaggle是一个数据分析建模的应用竞赛平台,企业或者研究者可以将问题背景、数据、期望指标等发布到Kaggle上,以竞赛的形式征集解决方案。参赛者可以下载/分析数据,使用统计/机器学习/数据挖掘等知识,建立算法模型,得出结果并提交。
Kaggle页面:Titanic: Machine Learning from Disaster
泰坦尼克号问题之背景
结合实例 Kaggle入门:逻辑回归应用之Kaggle泰坦尼克之灾 阅读本部分。
对数据进行总体上的初步了解。
一般用到pandas
和numpy
两个库。数据集如果是csv
文件:
1)用pd.read_csv()
读取并用data_train.head()
查看
——dataframe格式,显示部分示例(行),但能看到全部种类属性(列)
2)让dataframe自己告诉我们一些信息:data_train.info()
——包括数据共有多少条,各个属性有多少条(少于数据条数说明不全),属性格式(int,float,str等)
3)获取数值型属性的一些分布:data_train.describe()
——该数值型属性的条数,均值,标准差,最值等。文本型属性不显示。
仅仅通过上面的总体了解,依旧无法给我们提供想法和思路。
接下来用matplotlib
做可视化就很有必要了。
1)单个属性分析value_counts()
bar
,横坐标为该属性各个类,纵坐标为属于一类的数量。2)按x属性看y属性分布scatter()
3)x属性各个类的y属性分布[data.x==...]
kde
4)多个属性联合分析
横坐标为属性x各类,纵坐标为属于x属性一类且y属性一类的数量,
并把y属性各类用不同色叠在一起stacked=True
有时需要联合分析三个及以上属性,可分成几个表格并排观测。
data.A[data.B==..][data.C==..]
5)类别很多的属性
可以不做可视化,总体上分析,用data.groupby()
和data.count()
6)信息缺失的属性
可用pandas
的函数pd.notnull()
和pd.isnull()
按照是否缺失分类。
这里说的数据预处理,其实就包括了很多Kaggler津津乐道的feature engineering过程,灰常灰常有必要!
处理方式:
1)按有无数据将这个属性处理成Yes和No两种类型;
2)如果缺值的样本占总数比例极高,我们可能就直接舍弃了,作为特征加入的话,可能反倒带入noise,影响最后的结果;
3)如果缺值的样本适中,而该属性非连续值特征属性(比如说类目属性),那就把NaN作为一个新类别,加到类别特征中;
4)如果缺值的样本适中,而该属性为连续值特征属性,有时候我们会考虑给定一个step(比如这里的age,我们可以考虑每隔2/3岁为一个步长),然后把它离散化,之后把NaN作为一个type加到属性类目中;
5)有些情况下,缺失的值个数并不是特别多,那我们也可以试着根据已有的值,拟合一下数据,补充上。
拟合补全方法举例:用scikit-learn
中的RandomForest
拟合缺失数据。
(注:RandomForest
是一个用在原始数据中做不同采样,建立多棵DecisionTree
,再进行average
等等来降低过拟合现象,提高结果的机器学习算法)
因为逻辑回归建模时,需要输入的特征都是数值型特征,我们通常会先对类目型的特征做因子化。
我们使用pandas
的get_dummies
来完成这个工作。
sklearn.preprocessing.StandardScaler()
例如,使用scikit-learn中的LogisticRegression建模。
用正则取出我们要的属性值,然后调用
sklearn.linear_model.LogisticRegression()
得到一个model,接下来对测试集做和训练集同样的预处理,再丢进model。
将结果按需要整理后保存为csv
文件。
亲,你以为结果提交上了,就完事了? 我不会告诉你,这只是万里长征第一步啊(泪牛满面)!!!这才刚撸完baseline model啊!!!还得优化啊!!!
看过Andrew Ng老师的machine Learning课程的同学们,知道,我们应该分析分析模型现在的状态了,是过/欠拟合?,以确定我们需要更多的特征还是更多数据,或者其他操作。我们有一条很著名的learning curves对吧。
把得到的model系数和feature关联起来看看。
pd.DataFrame({"columns":list(train_df.columns)[1:], "coef":list(clf.coef_.T)})
表格生成了,先关注那些权重绝对值非常大的feature,获取思路。
『每做一次调整就make a submission,然后根据结果来判定这次调整的好坏』其实是行不通的…
重点来了:『要做交叉验证(cross validation)!』
我们通常情况下,这么做cross validation:把train.csv
分成两部分,一部分用于训练我们需要的模型,另外一部分数据上看我们预测算法的效果。
from sklearn.model_selection import cross_val_score, train_test_split
把交叉验证里面的bad case拿出来看看,看看人眼审核,是否能发现什么蛛丝马迹,是我们忽略了哪些信息,使得这些乘客被判定错了。再把bad case上得到的想法和前头系数分析的合在一起,然后逐个试试。
# 分割数据,按照 训练数据:cv数据 = 7:3的比例
split_train, split_cv = train_test_split(df, test_size=0.3, random_state=42)
isin(split_cv[predictions != cv_df.values[:,0]]
拿到bad cases之后,仔细看看。也会有一些猜测和想法。其中会有一部分可能会印证在系数分析部分的猜测,那这些优化的想法优先级可以放高一些。
我们随便列一些可能可以做的优化操作,然后我们可以使用手头上的”train_df”和”cv_df”开始试验这些feature engineering的tricks是否有效了。
试验的过程比较漫长,也需要有耐心,而且我们经常会面临很尴尬的状况,就是我们灵光一闪,想到一个feature,然后坚信它一定有效,结果试验下来,效果还不如试验之前的结果。恩,需要坚持和耐心,以及不断的挖掘。
著名的learning curve可以帮我们判定我们的模型现在所处的状态。我们以样本数为横坐标,训练和交叉验证集上的错误率作为纵坐标,两种状态分别如下两张图所示:过拟合(overfitting/high variace),欠拟合(underfitting/high bias)
我们用scikit-learn里面的learning_curve来帮我们分辨我们模型的状态。
from sklearn.model_selection import learning_curve
根据模型过拟合/欠拟合/符合预期来继续调整,做特征工程工作/添加新特征或组合特征。
模型融合可以比较好地缓解,训练过程中产生的过拟合问题,从而对于结果的准确度提升有一定的帮助。
如果只用一种模型也想运用融合思想,就在数据上动手脚。
每次取训练集的一个subset做训练,这样,我们虽然用的是同一个机器学习算法,但是得到的模型却是不一样的;同时,因为我们没有任何一份子数据集是全的,因此即使出现过拟合,也是在子训练集上出现过拟合,而不是全体数据上,这样做一个融合,可能对最后的结果有一定的帮助。对,这就是常用的Bagging。
from sklearn.ensemble import BaggingRegressor
对于任何的机器学习问题,不要一上来就追求尽善尽美,先用自己会的算法撸一个baseline的model出来,再进行后续的分析步骤,一步步提高。
在问题的解决过程中:
【资料来源】
机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
作者:寒小阳
Kaggle入门:逻辑回归应用之Kaggle泰坦尼克之灾
作者:EvanLi