假期结束,你的状态有没有回归?那么,放空脑袋后,先来学习学习,欢迎大家继续关注腾讯云技术社区

作者:赵成龙

这是一篇很难写的文章,因为我希望这篇文章能对大家有所帮助。我不会给大家介绍机器学习,数据挖掘的行业背景,也不会具体介绍逻辑回归,SVM,GBDT,神经网络等学习算法的理论依据和数学推导,本文更多的是在流程化上帮助大家快速的入门机器学习和数据建模。

本文主要分为四个部分(限于时间关系会分为上下两篇):

上篇:

  1. 准备篇,主要涉及环境搭建以及pandas基本知识。
  2. 应用篇,我会以kaggle上的Titanic为例,从数据源获取,数据清洗,特征处理,模型选择,模型输出与运用。

下篇:

  1. 优化篇,介绍了几种优化的方法。
  2. 思考篇,提出几个困扰我的问题,希望能得到大家的帮助吧。

一 准备篇

1环境搭建

整个sklearn的实验环境是:python 2.7 + pycharm + Anaconda。

2 pandas基础

这里只能大家介绍下面会用到的pandas知识,有兴趣的可以去具体的学习。给大家推荐一本参考书:《Python for Data Analysis》。有基础的可以直接跳到应用篇。

pandas主要会用到Series 和DataFrame两种数据结构。Series像是一维的数组,而DataFrame更像是一种二维的表结构。

Series的构造方法:

label=[,,,,]
data = pd.Series(data=label,index=['a','b','c','d','e'],dtype=int,name="label")
print data

Series取数据,通过index取数

data['a']
data[['a','b']]

DataFrame的构造

(1)以字典的形式构造

frame = pd.DataFrame({'name':['Time','Jack','Lily'],'Age':[,,],"weight":[56.7,64.0,50.0]})

(2)由DataFrame 构建DataFrame

frame1 = pd.DataFrame(frame,columns=["name","Age"])

从frame中读取了两列构成新的DataFrame。

DataFrame的操作

1 增加列

frame1["friends_num"]=[,,]

2 删除列

frame2 = frame1.drop(["name","Age"],axis=)

3 查找数据行

frame1[frame1["friends_num"]>]

结果如下:

DataFrame的统计方法

1 apply 配合lambda 处理列,如将frame1的Age列进行分段。

 frame1["Age_group"] = frame1["Age"].apply(lambda x:  if x <  else )

2 describe输出统计信息,非常强大

frame1.describe()

给出了8个统计量,对我们的数据处理特别有用。有个问题,直接使用describe方法只能统计数值类的列,对于字符类的变量没有统计。加个参数就行。

frame1.describe(include=['O'])

3 缺失值处理
pandas 对缺失值一般填充NAN。

#以0填充缺失值
frame1.fillna()
#丢掉任何包含NAN的行
frame1.dropna()
#删除全为nan的行
frame1.dropna(how="all")

二 应用篇

1 数据读取

本例以Titanic作为数据源。大家可以在附件获取到数据。

data = pd.DataFrame(pd.read_csv(train_path))
data_test = pd.DataFrame(pd.read_csv(test_path))
data_test = data_test[["Pclass","Name","Sex","Age","SibSp","Parch","Ticket","Fare","Cabin","Embarked"]]
x = data[["Pclass","Name","Sex","Age","SibSp","Parch","Ticket","Fare","Cabin","Embarked"]]
y = data[["Survived"]]
print x.describe()
print x.describe(include=['O'])
print data_test.describe()
print data_test.describe(include=['O'])

数据的初始统计信息:

2 数据清洗

1 缺失值处理。
Age和Embarked列存在少量缺失值,分别处理。

#用众数填充缺失值
data_set["Embarked"]=data_set["Embarked"].fillna('S')
#用均值填充Age缺失值
data_set["Age"]=data_set["Age"].fillna(data_set["Age"].mean())

2 删除缺失率较大的列(初步处理时)
Cabin列的缺失率达到了75%,删除改列。

data_set = data_set.drop([ "Cabin"], axis=)

3 特征处理

特征处理是基于具体的数据的,所以在特征处理之前要对数据做充分的理解。特征处理没有固定方法之说,主要靠个人的经验与观察,通过不断的尝试和变换,以期望挖掘出较好的特征变量。所以说,特征处理是模型建立过程中最耗时和耗神的工作。

1)单变量特征提取。

#根据name的长度,抽象出name_len特征
data_set["name_len"] = data_set["Name"].apply(len)

观察name列

通过观察Name列数据,可以发现名字中带有性别和婚否的称谓信息。提取这些信息(可能是有用的特征)。

data_set["name_class"] = data_set["Name"].apply(lambda x : x.split(",")[]).apply(lambda x :x.split()[])

2)多变量的组合
sibsp 代表兄弟姐妹和配偶的数量
parch 代表父母和子女的数量
因此可以将sibsp和parch结合获得家庭成员的数量

data_set["family_num"] = data_set["Parch"] + data_set["SibSp"] +

3)名义变量转数值变量

#Embarked
data_set["Embarked"]=data_set["Embarked"].map({'S':,'C':,'Q':}).astype(int)
#Sex
data_set["Sex"] = data_set["Sex"].apply(lambda x : if x=='male' else )

4)数据分段

根据统计信息和经验分段

#[7.91,14.45,31.0]根据Fare的统计信息进行分段
data_set["Fare"] = data_set["Fare"].apply(lambda x:cutFeature([7.91,14.45,31.0],x))
#[,,]按照经验分段
data_set["Age"] = data_set["Age"].apply(lambda x:cutFeature([,,],x))

简单的数据处理后,我们得到了如下12维数据:

4 模型选择与测试

初步选取了5种模型进行试验

RandomForestClassifier

ExtraTreesClassifier

AdaBoostClassifier

GradientBoostingClassifier

SVC

模型参数:

#随机森林
rf_params = {
'n_jobs': -,
'n_estimators': ,
'warm_start': True,
# 'max_features': 0.2,
'max_depth': ,
'min_samples_leaf': ,
'max_features': 'sqrt',
'verbose':
}
# Extra Trees 随机森林
et_params = {
'n_jobs': -,
'n_estimators': ,
# 'max_features': 0.5,
'max_depth': ,
'min_samples_leaf': ,
'verbose':
} # AdaBoost
ada_params = {
'n_estimators': ,
'learning_rate': 0.75
} # GBDT
gb_params = {
'n_estimators': ,
# 'max_features': 0.2,
'max_depth': ,
'min_samples_leaf': ,
'verbose':
} # SVC
svc_params = {
'kernel': 'linear',
'C': 0.025
}

模型选择代码:

classifiers = [
("rf_model", RandomForestClassifier(**rf_params)),
("et_model", ExtraTreesClassifier(**et_params)),
("ada_model", AdaBoostClassifier(**ada_params)),
("gb_model", GradientBoostingClassifier(**gb_params)),
("svc_model", SVC(**svc_params)),
] heldout = [0.95, 0.90, 0.75, 0.50, 0.01]
rounds =
xx = . - np.array(heldout)
for name, clf in classifiers:
print("training %s" % name)
rng = np.random.RandomState()
yy = []
for i in heldout:
yy_ = []
for r in range(rounds):
X_train_turn, X_test_turn, y_train_turn, y_test_turn = \
train_test_split(x_train, labels_train, test_size=i, random_state=rng)
clf.fit(X_train_turn, y_train_turn)
y_pred = clf.predict(X_test_turn)
yy_.append( - np.mean(y_pred == y_test_turn))
yy.append(np.mean(yy_))
plt.plot(xx, yy, label=name) plt.legend(loc="upper right")
plt.xlabel("Proportion train")
plt.ylabel("Test Error Rate")
plt.show()

选择结果如下:

从上图可以看出,randomForest的一般表现要优于其他算法。初步选择randomforest算法。
模型的在训练集上的表现:

def modelScore(x_train,labels_train,x_test,y_test,model_name,et_params):
print("--------%s------------")%(model_name)
model = model_name(**et_params) model.fit(x_train, labels_train)
if "feature_importances_" in dir(model):
print model.feature_importances_ print classification_report(
labels_train,
model.predict(x_train)) print classification_report(
y_test,
model.predict(x_test))
return model modelScore(x_train, labels_train, x_test, y_test, RandomForestClassifier, rf_params)

训练集的混淆矩阵如下图:

测试集的混淆矩阵如下图:

到此,初步的学习模型就建立起来了,测试集的准确度为83%。由于时间关系,优化篇和思考篇将放在下篇文章与大家分享,敬请期待。

如有任何错误或疑问,欢迎大家留言。期待与大家共同成长,共同进步!

温馨提示:文章相关的资料请阅读原文获取

相关阅读

机器学习:从入门到第一个模型

机器学习概念总结笔记(四)

当强化学习遇见泛函分析


此文已由作者授权腾讯云技术社区发布,转载请注明文章出处
原文链接:https://cloud.tencent.com/community/article/229506

5分钟教你玩转 sklearn 机器学习(上)的更多相关文章

  1. 小白的docker极简入门(二)、5分钟教你玩转docker安装

    0-前言 上一篇中,我们已经安装后Linux了,我们需要在Linux下安装docker,然后才能在docker中安装和部署各种应用 同样,5分钟教你完成docker正确安装和使用, 不是纸上谈兵,不是 ...

  2. 10分钟教你用VS2017将代码上传到GitHub

    前言 关于微软的Visual Studio系列,真可谓是宇宙最强IDE了.不过,像小编这样的菜鸟级别也用不到几个功能.今天给大家介绍一个比较实用的功能吧,把Visual Studio 2017里面写好 ...

  3. 10分钟教你用Python玩转微信之抓取好友个性签名制作词云

    01 前言+展示 各位小伙伴我又来啦.今天带大家玩点好玩的东西,用Python抓取我们的微信好友个性签名,然后制作词云.怎样,有趣吧~好了,下面开始干活.我知道你们还是想先看看效果的. 后台登录: 词 ...

  4. 10分钟教你用Python玩转微信之好友性别比例统计分析

    01 前言+效果展示 想必,微信对于大家来说,是再熟悉不过的了.那么,大家想不想探索一下微信上的各种奥秘呢?今天,我们一起来简单分析一下微信上的好友性别比例吧~废话不多说,开始干活. 结果如下: 02 ...

  5. 手把手教你玩转SOCKET模型之重叠I/O篇(下)

    四.     实现重叠模型的步骤 作 了这么多的准备工作,费了这么多的笔墨,我们终于可以开始着手编码了.其实慢慢的你就会明白,要想透析重叠结构的内部原理也许是要费点功夫,但是只是学会 如何来使用它,却 ...

  6. 10分钟 教你学会Linux/Unix下的vi文本编辑器

    10分钟 教你学会Linux/Unix下的vi文本编辑器 vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结.不敢独享,和你们共享. 首先,记住v ...

  7. 3分钟教你做一个iphone手机浏览器

    3分钟教你做一个iphone手机浏览器 第一步:新建一个Single View工程: 第二步:新建好工程,关闭arc. 第三步:拖放一个Text Field 一个UIButton 和一个 UIWebV ...

  8. GC算法精解(五分钟教你终极算法---分代搜集算法)

    GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们 ...

  9. Python 3 利用 Dlib 19.7 和 sklearn机器学习模型 实现人脸微笑检测

    0.引言  利用机器学习的方法训练微笑检测模型,给一张人脸照片,判断是否微笑:   使用的数据集中69张没笑脸,65张有笑脸,训练结果识别精度在95%附近: 效果: 图1 示例效果 工程利用pytho ...

随机推荐

  1. mysql:ip地址连接

    2. 为用户授权 授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 2.1登录MYSQL(有ROOT权限),这里以ROO ...

  2. ios 初体验<UIButton 控件>

    1.创建UIButton 跟其他方式不同,不是直接alloc,init 创建 用工厂化方式创建 UIButton *sureBtn = [UIButton buttonWithType:UIButto ...

  3. awk知识点全回顾

    本文目录:1.awk简介和基本语法格式2.print和printf格式化输出3.输入行的字段分隔符和行分隔符4.BGEIN和END5.数组6.流程控制语句 6.1 条件判断语句 6.2 while循环 ...

  4. linux系统下C语言调用lapack ,blas库

    在利用C语言编程,经常调用其他的软件包,其中lapack,blas库是最常用的两个库,这里讲下在linux系统下,C语言编程如何调用这两个库: 1.首先讲下blas库的调用,这里以两个向量内积函数为例 ...

  5. MySQL的JOIN(四):JOIN优化实践之快速匹配

    这篇博文讲述如何优化扫描速度.我们通过MySQL的JOIN(二):JOIN原理得知了两张表的JOIN操作就是不断从驱动表中取出记录,然后查找出被驱动表中与之匹配的记录并连接.这个过程的实质就是查询操作 ...

  6. Android 日夜间切换Demo

    这是其中一种实现模式,也是比较麻烦的一种,首先写布局,不多说上代码 activity_main.xml <?xml version="1.0" encoding=" ...

  7. 常用按钮css

    #openwx_btn {                                 border: 0px;                background-color: rgb(145, ...

  8. [转载]PS各个工具的字母快捷键和英文全名

    原文地址:PS各个工具的字母快捷键和英文全名作者:Tycho     选框-Marquee(M)     移动-move(V)     套索-Lasso(L)     魔棒-Wand(W) 喷枪-in ...

  9. ★RFC标准库_目录链接

    RFC(Request For Comments)是一个国际标准化的数据库,记录了从计算机到互联网的海量标准协议.它是一个免费公开的IT标准文件分享平台,其内容也在不断增长,与时俱进.它与ISO等组织 ...

  10. 转:JDK中的URLConnection参数详解

    针对JDK中的URLConnection连接Servlet的问题,网上有虽然有所涉及,但是只是说明了某一个或几个问题,是以FAQ的方式来解决的,而且比较零散,现在对这个类的使用就本人在项目中的使用经验 ...