当前位置: 首页 > news >正文

网站模板 餐饮路由器当服务器做网站

网站模板 餐饮,路由器当服务器做网站,织梦修改网站源代码,网站名称没有排名1.引言 我们先找个简单的实际例子#xff0c;来看看#xff0c;所谓的数据挖掘或者机器学习实际应用到底是怎么样一个过程。 2.背景 2.1 关于Kaggle Kaggle是一个数据分析建模的应用竞赛平台#xff0c;有点类似KDD-CUP#xff08;国际知识发现和数据挖掘竞赛#xff09;来看看所谓的数据挖掘或者机器学习实际应用到底是怎么样一个过程。 2.背景 2.1 关于Kaggle Kaggle是一个数据分析建模的应用竞赛平台有点类似KDD-CUP国际知识发现和数据挖掘竞赛企业或者研究者可以将问题背景、数据、期望指标等发布到Kaggle上以竞赛的形式向广大的数据科学家征集解决方案。而热爱数(dong)据(shou)挖(zhe)掘(teng)的小伙伴们可以下载/分析数据使用统计/机器学习/数据挖掘等知识建立算法模型得出结果并提交排名top的可能会有奖金哦 2.2 关于泰坦尼克号之灾 带大家去该问题页面溜达一圈吧下面是问题背景页 下面是可下载Data的页面 下面是小伙伴们最爱的forum页面你会看到各种神级人物厉(qi)害(pa)的数据处理/建模想法你会直视『世界真奇妙』。 泰坦尼克号问题之背景就是那个大家都熟悉的『Jack and Rose』的故事豪华游艇倒了大家都惊恐逃生可是救生艇的数量有限无法人人都有副船长发话了『lady and kid first』所以是否获救其实并非随机而是基于一些背景有rank先后的。训练和测试数据是一些乘客的个人信息以及存活状况要尝试根据它生成合适的模型并预测其他人的存活状况。对这是一个二分类问题是我们之前讨论的logistic regression所能处理的范畴。 3.说明 接触过Kaggle的同学们可能知道这个问题也可能知道RandomForest和SVM等等算法甚至还对多个模型做过融合取得过非常好的结果那maybe这篇文章并不是针对你的你可以自行略过。 我们因为之前只介绍了Logistic Regression这一种分类算法。所以本次的问题解决过程和优化思路都集中在这种算法上。其余的方法可能我们之后的文章里会提到。 说点个人的观点。不一定正确。 『解决一个问题的方法和思路不止一种』 『没有所谓的机器学习算法优劣也没有绝对高性能的机器学习算法只有在特定的场景、数据和特征下更合适的机器学习算法。』 4.怎么做 手把手教程马上就来先来两条我看到的觉得很重要的经验。 印象中Andrew Ng老师似乎在coursera上说过应用机器学习千万不要一上来就试图做到完美先撸一个baseline的model出来再进行后续的分析步骤一步步提高所谓后续步骤可能包括『分析model现在的状态(欠/过拟合)分析我们使用的feature的作用大小进行feature selection以及我们模型下的bad case和产生的原因』等等。Kaggle上的大神们也分享过一些experience说几条我记得的哈『对数据的认识太重要了』『数据中的特殊点/离群点的分析和处理太重要了』『特征工程(feature engineering)太重要了在很多Kaggle的场景下甚至比model本身还要重要』『要做模型融合(model ensemble)啊啊啊』 更多的经验分享请加讨论群具体方式请联系作者或者参见《“ML学分计划”说明书》 5.初探数据 先看看我们的数据长什么样吧。在Data下我们train.csv和test.csv两个文件分别存着官方给的训练和测试数据。 import pandas as pd #数据分析 import numpy as np #科学计算 from pandas import Series,DataFramedata_train pd.read_csv(/Users/Hanxiaoyang/Titanic_data/Train.csv) data_train pandas是常用的Python数据处理包把csv文件读入成dataframe各式我们在ipython notebook中看到data_train如下所示这就是典型的dataframe格式如果你没接触过这种格式完全没有关系你就把它想象成Excel里面的列好了。 我们看到总共有12列其中Survived字段表示的是该乘客是否获救其余都是乘客的个人信息包括 PassengerId 乘客IDPclass 乘客等级(1/2/3等舱位)Name 乘客姓名Sex 性别Age 年龄SibSp 堂兄弟/妹个数Parch 父母与小孩个数Ticket 船票信息Fare 票价Cabin 客舱Embarked 登船港口 逐条往下看要看完这么多条眼睛都有一种要瞎的赶脚。好吧我们让dataframe自己告诉我们一些信息如下所示 data_train.info() 1 1 看到了如下的信息  上面的数据说啥了它告诉我们训练数据中总共有891名乘客但是很不幸我们有些属性的数据不全比如说 Age年龄属性只有714名乘客有记录Cabin客舱更是只有204名乘客是已知的 似乎信息略少啊想再瞄一眼具体数据数值情况呢恩我们用下列的方法得到数值型数据的一些分布(因为有些属性比如姓名是文本型而另外一些属性比如登船港口是类目型。这些我们用下面的函数是看不到的)我们从上面看到更进一步的什么信息呢 mean字段告诉我们大概0.383838的人最后获救了2/3等舱的人数比1等舱要多平均乘客年龄大概是29.7岁(计算这个时候会略掉无记录的)等等… 6.数据初步分析 每个乘客都这么多属性那我们咋知道哪些属性更有用而又应该怎么用它们啊说实话这会儿我也不知道但我们记得前面提到过 『对数据的认识太重要了』『对数据的认识太重要了』『对数据的认识太重要了』 重要的事情说三遍恩说完了。仅仅最上面的对数据了解依旧无法给我们提供想法和思路。我们再深入一点来看看我们的数据看看每个/多个 属性和最后的Survived之间有着什么样的关系呢。 6.1 乘客各属性分布 脑容量太有限了…数值看花眼了。我们还是统计统计画些图来看看属性和结果之间的关系好了代码如下 import matplotlib.pyplot as plt fig plt.figure() fig.set(alpha0.2) # 设定图表颜色alpha参数plt.subplot2grid((2,3),(0,0)) # 在一张大图里分列几个小图 data_train.Survived.value_counts().plot(kindbar)# 柱状图 plt.title(u获救情况 (1为获救)) # 标题 plt.ylabel(u人数) plt.subplot2grid((2,3),(0,1)) data_train.Pclass.value_counts().plot(kindbar) plt.ylabel(u人数) plt.title(u乘客等级分布)plt.subplot2grid((2,3),(0,2)) plt.scatter(data_train.Survived, data_train.Age) plt.ylabel(u年龄) # 设定纵坐标名称 plt.grid(bTrue, whichmajor, axisy) plt.title(u按年龄看获救分布 (1为获救))plt.subplot2grid((2,3),(1,0), colspan2) data_train.Age[data_train.Pclass 1].plot(kindkde) data_train.Age[data_train.Pclass 2].plot(kindkde) data_train.Age[data_train.Pclass 3].plot(kindkde) plt.xlabel(u年龄)# plots an axis lable plt.ylabel(u密度) plt.title(u各等级的乘客年龄分布) plt.legend((u头等舱, u2等舱,u3等舱),locbest) # sets our legend for our graph.plt.subplot2grid((2,3),(1,2)) data_train.Embarked.value_counts().plot(kindbar) plt.title(u各登船口岸上船人数) plt.ylabel(u人数) plt.show()bingo图还是比数字好看多了。所以我们在图上可以看出来被救的人300多点不到半数3等舱乘客灰常多遇难和获救的人年龄似乎跨度都很广3个不同的舱年龄总体趋势似乎也一致2/3等舱乘客20岁多点的人最多1等舱40岁左右的最多(→_→似乎符合财富和年龄的分配哈咳咳别理我我瞎扯的)登船港口人数按照S、C、Q递减而且S远多于另外俩港口。 这个时候我们可能会有一些想法了 不同舱位/乘客等级可能和财富/地位有关系最后获救概率可能会不一样年龄对获救概率也一定是有影响的毕竟前面说了副船长还说『小孩和女士先走』呢和登船港口是不是有关系呢也许登船港口不同人的出身地位不同 口说无凭空想无益。老老实实再来统计统计看看这些属性值的统计分布吧。 6.2 属性与获救结果的关联统计 #看看各乘客等级的获救情况 fig plt.figure() fig.set(alpha0.2) # 设定图表颜色alpha参数Survived_0 data_train.Pclass[data_train.Survived 0].value_counts() Survived_1 data_train.Pclass[data_train.Survived 1].value_counts() dfpd.DataFrame({u获救:Survived_1, u未获救:Survived_0}) df.plot(kindbar, stackedTrue) plt.title(u各乘客等级的获救情况) plt.xlabel(u乘客等级) plt.ylabel(u人数) plt.show()啧啧果然钱和地位对舱位有影响进而对获救的可能性也有影响啊←_← 咳咳跑题了我想说的是明显等级为1的乘客获救的概率高很多。恩这个一定是影响最后获救结果的一个特征。 #看看各性别的获救情况 fig plt.figure() fig.set(alpha0.2) # 设定图表颜色alpha参数Survived_m data_train.Survived[data_train.Sex male].value_counts() Survived_f data_train.Survived[data_train.Sex female].value_counts() dfpd.DataFrame({u男性:Survived_m, u女性:Survived_f}) df.plot(kindbar, stackedTrue) plt.title(u按性别看获救情况) plt.xlabel(u性别) plt.ylabel(u人数) plt.show()歪果盆友果然很尊重ladylady first践行得不错。性别无疑也要作为重要特征加入最后的模型之中。 再来个详细版的好了。 #然后我们再来看看各种舱级别情况下各性别的获救情况 figplt.figure() fig.set(alpha0.65) # 设置图像透明度无所谓 plt.title(u根据舱等级和性别的获救情况)ax1fig.add_subplot(141) data_train.Survived[data_train.Sex female][data_train.Pclass ! 3].value_counts().plot(kindbar, labelfemale highclass, color#FA2479) ax1.set_xticklabels([u获救, u未获救], rotation0) ax1.legend([u女性/高级舱], locbest)ax2fig.add_subplot(142, shareyax1) data_train.Survived[data_train.Sex female][data_train.Pclass 3].value_counts().plot(kindbar, labelfemale, low class, colorpink) ax2.set_xticklabels([u未获救, u获救], rotation0) plt.legend([u女性/低级舱], locbest)ax3fig.add_subplot(143, shareyax1) data_train.Survived[data_train.Sex male][data_train.Pclass ! 3].value_counts().plot(kindbar, labelmale, high class,colorlightblue) ax3.set_xticklabels([u未获救, u获救], rotation0) plt.legend([u男性/高级舱], locbest)ax4fig.add_subplot(144, shareyax1) data_train.Survived[data_train.Sex male][data_train.Pclass 3].value_counts().plot(kindbar, labelmale low class, colorsteelblue) ax4.set_xticklabels([u未获救, u获救], rotation0) plt.legend([u男性/低级舱], locbest)plt.show()恩坚定了之前的判断。 我们看看各登船港口的获救情况。 fig plt.figure() fig.set(alpha0.2) # 设定图表颜色alpha参数Survived_0 data_train.Embarked[data_train.Survived 0].value_counts() Survived_1 data_train.Embarked[data_train.Survived 1].value_counts() dfpd.DataFrame({u获救:Survived_1, u未获救:Survived_0}) df.plot(kindbar, stackedTrue) plt.title(u各登录港口乘客的获救情况) plt.xlabel(u登录港口) plt.ylabel(u人数) plt.show()下面我们来看看 堂兄弟/妹孩子/父母有几人对是否获救的影响。g data_train.groupby([SibSp,Survived]) df pd.DataFrame(g.count()[PassengerId]) print dfg data_train.groupby([SibSp,Survived]) df pd.DataFrame(g.count()[PassengerId]) print df123456789 123456789好吧没看出特别特别明显的规律(为自己的智商感到捉急…)先作为备选特征放一放。#ticket是船票编号应该是unique的和最后的结果没有太大的关系先不纳入考虑的特征范畴把 #cabin只有204个乘客有值我们先看看它的一个分布 data_train.Cabin.value_counts()12345 12345 部分结果如下  这三三两两的…如此不集中…我们猜一下也许前面的ABCDE是指的甲板位置、然后编号是房间号…好吧我瞎说的别当真… 关键是Cabin这鬼属性应该算作类目型的本来缺失值就多还如此不集中注定是个棘手货…第一感觉这玩意儿如果直接按照类目特征处理的话太散了估计每个因子化后的特征都拿不到什么权重。加上有那么多缺失值要不我们先把Cabin缺失与否作为条件(虽然这部分信息缺失可能并非未登记maybe只是丢失了而已所以这样做未必妥当)先在有无Cabin信息这个粗粒度上看看Survived的情况好了。fig plt.figure() fig.set(alpha0.2) # 设定图表颜色alpha参数Survived_cabin data_train.Survived[pd.notnull(data_train.Cabin)].value_counts() Survived_nocabin data_train.Survived[pd.isnull(data_train.Cabin)].value_counts() dfpd.DataFrame({u有:Survived_cabin, u无:Survived_nocabin}).transpose() df.plot(kindbar, stackedTrue) plt.title(u按Cabin有无看获救情况) plt.xlabel(uCabin有无) plt.ylabel(u人数) plt.show()咳咳有Cabin记录的似乎获救概率稍高一些先这么着放一放吧。 7.简单数据预处理 大体数据的情况看了一遍对感兴趣的属性也有个大概的了解了。 下一步干啥咱们该处理处理这些数据为机器学习建模做点准备了。 对了我这里说的数据预处理其实就包括了很多Kaggler津津乐道的feature engineering过程灰常灰常有必要 『特征工程(feature engineering)太重要了』 『特征工程(feature engineering)太重要了』 『特征工程(feature engineering)太重要了』 恩重要的事情说三遍。 先从最突出的数据属性开始吧对Cabin和Age有丢失数据实在是对下一步工作影响太大。 先说Cabin暂时我们就按照刚才说的按Cabin有无数据将这个属性处理成Yes和No两种类型吧。 再说Age 通常遇到缺值的情况我们会有几种常见的处理方式 如果缺值的样本占总数比例极高我们可能就直接舍弃了作为特征加入的话可能反倒带入noise影响最后的结果了如果缺值的样本适中而该属性非连续值特征属性(比如说类目属性)那就把NaN作为一个新类别加到类别特征中如果缺值的样本适中而该属性为连续值特征属性有时候我们会考虑给定一个step(比如这里的age我们可以考虑每隔2/3岁为一个步长)然后把它离散化之后把NaN作为一个type加到属性类目中。有些情况下缺失的值个数并不是特别多那我们也可以试着根据已有的值拟合一下数据补充上。 本例中后两种处理方式应该都是可行的我们先试试拟合补全吧(虽然说没有特别多的背景可供我们拟合这不一定是一个多么好的选择) 我们这里用scikit-learn中的RandomForest来拟合一下缺失的年龄数据(注RandomForest是一个用在原始数据中做不同采样建立多颗DecisionTree再进行average等等来降低过拟合现象提高结果的机器学习算法我们之后会介绍到)from sklearn.ensemble import RandomForestRegressor### 使用 RandomForestClassifier 填补缺失的年龄属性 def set_missing_ages(df):# 把已有的数值型特征取出来丢进Random Forest Regressor中age_df df[[Age,Fare, Parch, SibSp, Pclass]]# 乘客分成已知年龄和未知年龄两部分known_age age_df[age_df.Age.notnull()].as_matrix()unknown_age age_df[age_df.Age.isnull()].as_matrix()# y即目标年龄y known_age[:, 0]# X即特征属性值X known_age[:, 1:]# fit到RandomForestRegressor之中rfr RandomForestRegressor(random_state0, n_estimators2000, n_jobs-1)rfr.fit(X, y)# 用得到的模型进行未知年龄结果预测predictedAges rfr.predict(unknown_age[:, 1::])# 用得到的预测结果填补原缺失数据df.loc[ (df.Age.isnull()), Age ] predictedAges return df, rfrdef set_Cabin_type(df):df.loc[ (df.Cabin.notnull()), Cabin ] Yesdf.loc[ (df.Cabin.isnull()), Cabin ] Noreturn dfdata_train, rfr set_missing_ages(data_train) data_train set_Cabin_type(data_train) 30恩。目的达到OK了。 因为逻辑回归建模时需要输入的特征都是数值型特征我们通常会先对类目型的特征因子化。 什么叫做因子化呢举个例子 以Cabin为例原本一个属性维度因为其取值可以是[‘yes’,’no’]而将其平展开为’Cabin_yes’,’Cabin_no’两个属性 原本Cabin取值为yes的在此处的”Cabin_yes”下取值为1在”Cabin_no”下取值为0原本Cabin取值为no的在此处的”Cabin_yes”下取值为0在”Cabin_no”下取值为1 我们使用pandas的”get_dummies”来完成这个工作并拼接在原来的”data_train”之上如下所示。dummies_Cabin pd.get_dummies(data_train[Cabin], prefix Cabin)dummies_Embarked pd.get_dummies(data_train[Embarked], prefix Embarked)dummies_Sex pd.get_dummies(data_train[Sex], prefix Sex)dummies_Pclass pd.get_dummies(data_train[Pclass], prefix Pclass)df pd.concat([data_train, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis1) df.drop([Pclass, Name, Sex, Ticket, Cabin, Embarked], axis1, inplaceTrue) dfbingo我们很成功地把这些类目属性全都转成01的数值属性了。 这样看起来是不是我们需要的属性值都有了且它们都是数值型属性呢。 有一种临近结果的宠宠欲动感吧莫急莫急我们还得做一些处理仔细看看Age和Fare两个属性乘客的数值幅度变化也忒大了吧如果大家了解逻辑回归与梯度下降的话会知道各属性值之间scale差距太大将对收敛速度造成几万点伤害值甚至不收敛 (╬▔皿▔)…所以我们先用scikit-learn里面的preprocessing模块对这俩货做一个scaling所谓scaling其实就是将一些变化幅度较大的特征化到[-1,1]之内。 import sklearn.preprocessing as preprocessing scaler preprocessing.StandardScaler() age_scale_param scaler.fit(df[Age]) df[Age_scaled] scaler.fit_transform(df[Age], age_scale_param) fare_scale_param scaler.fit(df[Fare]) df[Fare_scaled] scaler.fit_transform(df[Fare], fare_scale_param) df恩好看多了万事俱备只欠建模。马上就要看到成效了哈哈。我们把需要的属性值抽出来转成scikit-learn里面LogisticRegression可以处理的格式。 8.逻辑回归建模 我们把需要的feature字段取出来转成numpy格式使用scikit-learn中的LogisticRegression建模。 from sklearn import linear_model# 用正则取出我们要的属性值 train_df df.filter(regexSurvived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*) train_np train_df.as_matrix()# y即Survival结果 y train_np[:, 0]# X即特征属性值 X train_np[:, 1:]# fit到RandomForestRegressor之中 clf linear_model.LogisticRegression(C1.0, penaltyl1, tol1e-6) clf.fit(X, y)clf good很顺利我们得到了一个model如下  先淡定淡定你以为把test.csv直接丢进model里就能拿到结果啊…骚年图样图森破啊我们的”test_data”也要做和”train_data”一样的预处理啊data_test pd.read_csv(/Users/Hanxiaoyang/Titanic_data/test.csv) data_test.loc[ (data_test.Fare.isnull()), Fare ] 0 # 接着我们对test_data做和train_data中一致的特征变换 # 首先用同样的RandomForestRegressor模型填上丢失的年龄 tmp_df data_test[[Age,Fare, Parch, SibSp, Pclass]] null_age tmp_df[data_test.Age.isnull()].as_matrix() # 根据特征属性X预测年龄并补上 X null_age[:, 1:] predictedAges rfr.predict(X) data_test.loc[ (data_test.Age.isnull()), Age ] predictedAgesdata_test set_Cabin_type(data_test) dummies_Cabin pd.get_dummies(data_test[Cabin], prefix Cabin) dummies_Embarked pd.get_dummies(data_test[Embarked], prefix Embarked) dummies_Sex pd.get_dummies(data_test[Sex], prefix Sex) dummies_Pclass pd.get_dummies(data_test[Pclass], prefix Pclass)df_test pd.concat([data_test, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis1) df_test.drop([Pclass, Name, Sex, Ticket, Cabin, Embarked], axis1, inplaceTrue) df_test[Age_scaled] scaler.fit_transform(df_test[Age], age_scale_param) df_test[Fare_scaled] scaler.fit_transform(df_test[Fare], fare_scale_param) df_test不错不错数据很OK差最后一步了。 下面就做预测取结果吧 test df_test.filter(regexAge_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*) predictions clf.predict(test) result pd.DataFrame({PassengerId:data_test[PassengerId].as_matrix(), Survived:predictions.astype(np.int32)}) result.to_csv(/Users/Hanxiaoyang/Titanic_data/logistic_regression_predictions.csv, indexFalse)啧啧挺好格式正确去make a submission啦啦啦 在Kaggle的Make a submission页面提交上结果。如下  0.76555恩结果还不错。毕竟这只是我们简单分析处理过后出的一个baseline模型嘛。 9.逻辑回归系统优化 9.1 模型系数关联分析 亲你以为结果提交上了就完事了 我不会告诉你这只是万里长征第一步啊(泪牛满面)这才刚撸完baseline model啊还得优化啊 看过Andrew Ng老师的machine Learning课程的同学们知道我们应该分析分析模型现在的状态了是过/欠拟合以确定我们需要更多的特征还是更多数据或者其他操作。我们有一条很著名的learning curves对吧。 不过在现在的场景下先不着急做这个事情我们这个baseline系统还有些粗糙先再挖掘挖掘。 首先Name和Ticket两个属性被我们完整舍弃了(好吧其实是因为这俩属性几乎每一条记录都是一个完全不同的值我们并没有找到很直接的处理方式)。然后我们想想年龄的拟合本身也未必是一件非常靠谱的事情我们依据其余属性其实并不能很好地拟合预测出未知的年龄。再一个以我们的日常经验小盆友和老人可能得到的照顾会多一些这样看的话年龄作为一个连续值给一个固定的系数应该和年龄是一个正相关或者负相关似乎体现不出两头受照顾的实际情况所以说不定我们把年龄离散化按区段分作类别属性会更合适一些。 上面只是我瞎想的who knows是不是这么回事呢老老实实先把得到的model系数和feature关联起来看看。 pd.DataFrame({columns:list(train_df.columns)[1:], coef:list(clf.coef_.T)})首先大家回去前两篇文章里瞄一眼公式就知道这些系数为正的特征和最后结果是一个正相关反之为负相关。 我们先看看那些权重绝对值非常大的feature在我们的模型上 Sex属性如果是female会极大提高最后获救的概率而male会很大程度拉低这个概率。Pclass属性1等舱乘客最后获救的概率会上升而乘客等级为3会极大地拉低这个概率。有Cabin值会很大程度拉升最后获救概率(这里似乎能看到了一点端倪事实上从最上面的有无Cabin记录的Survived分布图上看出即使有Cabin记录的乘客也有一部分遇难了估计这个属性上我们挖掘还不够)Age是一个负相关意味着在我们的模型里年龄越小越有获救的优先权(还得回原数据看看这个是否合理有一个登船港口S会很大程度拉低获救的概率另外俩港口压根就没啥作用(这个实际上非常奇怪因为我们从之前的统计图上并没有看到S港口的获救率非常低所以也许可以考虑把登船港口这个feature去掉试试)。船票Fare有小幅度的正相关(并不意味着这个feature作用不大有可能是我们细化的程度还不够举个例子说不定我们得对它离散化再分至各个乘客等级上) 噢啦观察完了我们现在有一些想法了但是怎么样才知道哪些优化的方法是promising的呢 因为test.csv里面并没有Survived这个字段(好吧这是废话这明明就是我们要预测的结果)我们无法在这份数据上评定我们算法在该场景下的效果… 而『每做一次调整就make a submission然后根据结果来判定这次调整的好坏』其实是行不通的… 9.2 交叉验证 重点又来了 『要做交叉验证(cross validation)!』 『要做交叉验证(cross validation)!』 『要做交叉验证(cross validation)!』 恩重要的事情说三遍。我们通常情况下这么做cross validation把train.csv分成两部分一部分用于训练我们需要的模型另外一部分数据上看我们预测算法的效果。 我们用scikit-learn的cross_validation来帮我们完成小数据集上的这个工作。 先简单看看cross validation情况下的打分 from sklearn import cross_validation#简单看看打分情况 clf linear_model.LogisticRegression(C1.0, penaltyl1, tol1e-6) all_data df.filter(regexSurvived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*) X all_data.as_matrix()[:,1:] y all_data.as_matrix()[:,0] print cross_validation.cross_val_score(clf, X, y, cv5) 结果是下面酱紫的 [0.81564246 0.81005587 0.78651685 0.78651685 0.81355932] 似乎比Kaggle上的结果略高哈毕竟用的是不是同一份数据集评估的。 等等既然我们要做交叉验证那我们干脆先把交叉验证里面的bad case拿出来看看看看人眼审核是否能发现什么蛛丝马迹是我们忽略了哪些信息使得这些乘客被判定错了。再把bad case上得到的想法和前头系数分析的合在一起然后逐个试试。 下面我们做数据分割并且在原始数据集上瞄一眼bad case # 分割数据按照 训练数据:cv数据 7:3的比例 split_train, split_cv cross_validation.train_test_split(df, test_size0.3, random_state0) train_df split_train.filter(regexSurvived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*) # 生成模型 clf linear_model.LogisticRegression(C1.0, penaltyl1, tol1e-6) clf.fit(train_df.as_matrix()[:,1:], train_df.as_matrix()[:,0])# 对cross validation数据进行预测cv_df split_cv.filter(regexSurvived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*) predictions clf.predict(cv_df.as_matrix()[:,1:])origin_data_train pd.read_csv(/Users/HanXiaoyang/Titanic_data/Train.csv) bad_cases origin_data_train.loc[origin_data_train[PassengerId].isin(split_cv[predictions ! cv_df.as_matrix()[:,0]][PassengerId].values)] bad_cases 我们判定错误的 bad case 中部分数据如下  大家可以自己跑一遍试试拿到bad cases之后仔细看看。也会有一些猜测和想法。其中会有一部分可能会印证在系数分析部分的猜测那这些优化的想法优先级可以放高一些。 现在有了”train_df” 和 “vc_df” 两个数据部分前者用于训练model后者用于评定和选择模型。可以开始可劲折腾了。 我们随便列一些可能可以做的优化操作 Age属性不使用现在的拟合方式而是根据名称中的『Mr』『Mrs』『Miss』等的平均值进行填充。Age不做成一个连续值属性而是使用一个步长进行离散化变成离散的类目feature。Cabin再细化一些对于有记录的Cabin属性我们将其分为前面的字母部分(我猜是位置和船层之类的信息) 和 后面的数字部分(应该是房间号有意思的事情是如果你仔细看看原始数据你会发现这个值大的情况下似乎获救的可能性高一些)。Pclass和Sex俩太重要了我们试着用它们去组出一个组合属性来试试这也是另外一种程度的细化。单加一个Child字段Age12的设为1其余为0(你去看看数据确实小盆友优先程度很高啊)如果名字里面有『Mrs』而Parch1的我们猜测她可能是一个母亲应该获救的概率也会提高因此可以多加一个Mother字段此种情况下设为1其余情况下设为0登船港口可以考虑先去掉试试(Q和C本来就没权重S有点诡异)把堂兄弟/兄妹 和 Parch 还有自己 个数加在一起组一个Family_size字段(考虑到大家族可能对最后的结果有影响)Name是一个我们一直没有触碰的属性我们可以做一些简单的处理比如说男性中带某些字眼的(‘Capt’, ‘Don’, ‘Major’, ‘Sir’)可以统一到一个Title女性也一样。 大家接着往下挖掘可能还可以想到更多可以细挖的部分。我这里先列这些了然后我们可以使用手头上的”train_df”和”cv_df”开始试验这些feature engineering的tricks是否有效了。 试验的过程比较漫长也需要有耐心而且我们经常会面临很尴尬的状况就是我们灵光一闪想到一个feature然后坚信它一定有效结果试验下来效果还不如试验之前的结果。恩需要坚持和耐心以及不断的挖掘。 我最好的结果是在『Survived~C(Pclass)C(Title)C(Sex)C(Age_bucket)C(Cabin_num_bucket)MotherFareFamily_Size』下取得的结果如下(抱歉博主君commit的时候手抖把页面关了于是没截着图下面这张图是在我得到最高分之后用这次的结果重新make commission的截了个图得分是0.79426不是目前我的最高分哈因此排名木有变…)9.3 learning curves 有一个很可能发生的问题是我们不断地做feature engineering产生的特征越来越多用这些特征去训练模型会对我们的训练集拟合得越来越好同时也可能在逐步丧失泛化能力从而在待预测的数据上表现不佳也就是发生过拟合问题。 从另一个角度上说如果模型在待预测的数据上表现不佳除掉上面说的过拟合问题也有可能是欠拟合问题也就是说在训练集上其实拟合的也不是那么好。 额这个欠拟合和过拟合怎么解释呢。这么说吧 过拟合就像是你班那个学数学比较刻板的同学老师讲过的题目一字不漏全记下来了于是老师再出一样的题目分分钟精确出结果。but数学考试因为总是碰到新题目所以成绩不咋地。欠拟合就像是咳咳和博主level差不多的差生。连老师讲的练习题也记不住于是连老师出一样题目复习的周测都做不好考试更是可想而知了。 而在机器学习的问题上对于过拟合和欠拟合两种情形。我们优化的方式是不同的。 对过拟合而言通常以下策略对结果优化是有用的 做一下feature selection挑出较好的feature的subset来做training提供更多的数据从而弥补原始数据的bias问题学习到的model也会更准确 而对于欠拟合而言我们通常需要更多的feature更复杂的模型来提高准确度。 著名的learning curve可以帮我们判定我们的模型现在所处的状态。我们以样本数为横坐标训练和交叉验证集上的错误率作为纵坐标两种状态分别如下两张图所示过拟合(overfitting/high variace)欠拟合(underfitting/high bias)我们也可以把错误率替换成准确率(得分)得到另一种形式的learning curve(sklearn 里面是这么做的)。 回到我们的问题我们用scikit-learn里面的learning_curve来帮我们分辨我们模型的状态。举个例子这里我们一起画一下我们最先得到的baseline model的learning curve。 import numpy as np import matplotlib.pyplot as plt from sklearn.learning_curve import learning_curve# 用sklearn的learning_curve得到training_score和cv_score使用matplotlib画出learning curve def plot_learning_curve(estimator, title, X, y, ylimNone, cvNone, n_jobs1, train_sizesnp.linspace(.05, 1., 20), verbose0, plotTrue):画出data在某模型上的learning curve.参数解释----------estimator : 你用的分类器。title : 表格的标题。X : 输入的featurenumpy类型y : 输入的target vectorylim : tuple格式的(ymin, ymax), 设定图像中纵坐标的最低点和最高点cv : 做cross-validation的时候数据分成的份数其中一份作为cv集其余n-1份作为training(默认为3份)n_jobs : 并行的的任务数(默认1)train_sizes, train_scores, test_scores learning_curve(estimator, X, y, cvcv, n_jobsn_jobs, train_sizestrain_sizes, verboseverbose)train_scores_mean np.mean(train_scores, axis1)train_scores_std np.std(train_scores, axis1)test_scores_mean np.mean(test_scores, axis1)test_scores_std np.std(test_scores, axis1)if plot:plt.figure()plt.title(title)if ylim is not None:plt.ylim(*ylim)plt.xlabel(u训练样本数)plt.ylabel(u得分)plt.gca().invert_yaxis()plt.grid()plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean train_scores_std, alpha0.1, colorb)plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean test_scores_std, alpha0.1, colorr)plt.plot(train_sizes, train_scores_mean, o-, colorb, labelu训练集上得分)plt.plot(train_sizes, test_scores_mean, o-, colorr, labelu交叉验证集上得分)plt.legend(locbest)plt.draw()plt.show()plt.gca().invert_yaxis()midpoint ((train_scores_mean[-1] train_scores_std[-1]) (test_scores_mean[-1] - test_scores_std[-1])) / 2diff (train_scores_mean[-1] train_scores_std[-1]) - (test_scores_mean[-1] - test_scores_std[-1])return midpoint, diffplot_learning_curve(clf, u学习曲线, X, y)在实际数据上看我们得到的learning curve没有理论推导的那么光滑哈但是可以大致看出来训练集和交叉验证集上的得分曲线走势还是符合预期的。 目前的曲线看来我们的model并不处于overfitting的状态(overfitting的表现一般是训练集上得分高而交叉验证集上要低很多中间的gap比较大)。因此我们可以再做些feature engineering的工作添加一些新产出的特征或者组合特征到模型中。 10.模型融合(model ensemble) 好了终于到这一步了我们要祭出机器学习/数据挖掘上通常最后会用到的大杀器了。恩模型融合。 『强迫症患者』打算继续喊喊口号… 『模型融合(model ensemble)很重要』 『模型融合(model ensemble)很重要』 『模型融合(model ensemble)很重要』 重要的事情说三遍恩噢啦。 先解释解释一会儿再回到我们的问题上哈。 啥叫模型融合呢我们还是举几个例子直观理解一下好了。 大家都看过知识问答的综艺节目中求助现场观众时候让观众投票最高的答案作为自己的答案的形式吧每个人都有一个判定结果最后我们相信答案在大多数人手里。 再通俗一点举个例子。你和你班某数学大神关系好每次作业都『模仿』他的于是绝大多数情况下他做对了你也对了。突然某一天大神脑子犯糊涂手一抖写错了一个数于是…恩你也只能跟着错了。 我们再来看看另外一个场景你和你班5个数学大神关系都很好每次都把他们作业拿过来对比一下再『自己做』那你想想如果哪天某大神犯糊涂了写错了but另外四个写对了啊那你肯定相信另外4人的是正确答案吧 最简单的模型融合大概就是这么个意思比如分类问题当我们手头上有一堆在同一份数据集上训练得到的分类器(比如logistic regressionSVMKNNrandom forest神经网络)那我们让他们都分别去做判定然后对结果做投票统计取票数最多的结果为最后结果。 bingo问题就这么完美的解决了。 模型融合可以比较好地缓解训练过程中产生的过拟合问题从而对于结果的准确度提升有一定的帮助。 话说回来回到我们现在的问题。你看我们现在只讲了logistic regression如果我们还想用这个融合思想去提高我们的结果我们该怎么做呢 既然这个时候模型没得选那咱们就在数据上动动手脚咯。大家想想如果模型出现过拟合现在一定是在我们的训练上出现拟合过度造成的对吧。 那我们干脆就不要用全部的训练集每次取训练集的一个subset做训练这样我们虽然用的是同一个机器学习算法但是得到的模型却是不一样的同时因为我们没有任何一份子数据集是全的因此即使出现过拟合也是在子训练集上出现过拟合而不是全体数据上这样做一个融合可能对最后的结果有一定的帮助。对这就是常用的Bagging。 我们用scikit-learn里面的Bagging来完成上面的思路过程非常简单。代码如下 from sklearn.ensemble import BaggingRegressortrain_df df.filter(regexSurvived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass.*|Mother|Child|Family|Title) train_np train_df.as_matrix()# y即Survival结果 y train_np[:, 0]# X即特征属性值 X train_np[:, 1:]# fit到BaggingRegressor之中 clf linear_model.LogisticRegression(C1.0, penaltyl1, tol1e-6) bagging_clf BaggingRegressor(clf, n_estimators20, max_samples0.8, max_features1.0, bootstrapTrue, bootstrap_featuresFalse, n_jobs-1) bagging_clf.fit(X, y)test df_test.filter(regexAge_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass.*|Mother|Child|Family|Title) predictions bagging_clf.predict(test) result pd.DataFrame({PassengerId:data_test[PassengerId].as_matrix(), Survived:predictions.astype(np.int32)}) result.to_csv(/Users/HanXiaoyang/Titanic_data/logistic_regression_bagging_predictions.csv, indexFalse) 然后你再Make a submission恩发现对结果还是有帮助的。11.总结 对于任何的机器学习问题不要一上来就追求尽善尽美先用自己会的算法撸一个baseline的model出来再进行后续的分析步骤一步步提高。 在问题的结果过程中 『对数据的认识太重要了』『数据中的特殊点/离群点的分析和处理太重要了』『特征工程(feature engineering)太重要了』『模型融合(model ensemble)太重要了』 本文中用机器学习解决问题的过程大概如下图所示
http://www.sadfv.cn/news/91755/

相关文章:

  • 律师事务所网站模板国外的自建网站怎么做
  • 淮安新网站制作郑州工程网官网最新版入口
  • 信阳百度推广公司电话东营网站搜索引擎优化
  • 网站开发人员岗位seo是什么地方
  • 营销型网站建设费用怎么这么大网站首页的导航栏
  • 优秀产品设计案例江门搜狗网站推广优化
  • 网站主题下载微信支付 网站开发
  • 建外做网站的公司平台设计是什么
  • 如何进行网站设计中国市场网
  • 阜康网站建设创建公众号的流程
  • 东台做网站哪家便宜网店推广方案范文
  • 高端定制网站开发需要多少钱色彩网站设计师
  • 网站开发三大元素如何设计网站中的上传功能
  • 基于html的个人网站的设计与实现论文正保建设工程教育网官网
  • 开源网站官网免费申请域名的步骤
  • 用wordpress建立的网站吗泰安
  • 做外贸有那些网站平台米拓cms 网站模板在哪
  • 网站上传好了如何做定向哈尔滨网站建设方案服务
  • 怎么做整人点不完的网站乐趣公园 wordpress
  • html5 单页网站网站建设维护成
  • 移动网站建设推广中国制造网怎么样
  • 承德做网站的公司怎样做自己的国外网站
  • 上海网站建设公司介绍怎么制作网站栏目页主页
  • 新人做网站盈利南京怎样优化关键词排名
  • 专业苏州网站建设建立一个网站的技术解决方案
  • 哪些网站可以做网店免费建设网站好吗
  • 承德网站推广舟山建设技术学校网站首页
  • 江山市城乡建设局网站仿牌网站
  • 厦门建模培训广州做seo整站优化公司
  • 朝阳市做网站用域名和主机做网站的详细过程