5分钟教你玩转 sklearn 机器学习(上)

作者: 赵成龙 2017-10-11 15:17:42

这是一篇很难写的文章,因为我希望这篇文章能对大家有所帮助。我不会给大家介绍机器学习,数据挖掘的行业背景,也不会具体介绍逻辑回归,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的构造方法:

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

Series取数据,通过index取数

  1. data['a' 
  2. data[['a','b']] 

DataFrame的构造

(1)以字典的形式构造

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

(2)由DataFrame 构建DataFrame

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

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

DataFrame的操作

1 增加列

  1. frame1["friends_num"]=[10,12,14] 

2 删除列

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

3 查找数据行

  1. frame1[frame1["friends_num"]>10] 

结果如下:

DataFrame的统计方法

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

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

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

  1. frame1.describe() 

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

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

3 缺失值处理

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

二 应用篇

1 数据读取

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

  1. data = pd.DataFrame(pd.read_csv(train_path)) 
  2. data_test = pd.DataFrame(pd.read_csv(test_path)) 
  3. data_test = data_test[["Pclass","Name","Sex","Age","SibSp","Parch","Ticket","Fare","Cabin","Embarked"]] 
  4. x = data[["Pclass","Name","Sex","Age","SibSp","Parch","Ticket","Fare","Cabin","Embarked"]] 
  5. y = data[["Survived"]] 
  6. print x.describe() 
  7. print x.describe(include=['O']) 
  8. print data_test.describe() 
  9. print data_test.describe(include=['O']) 

数据的初始统计信息:

2 数据清洗

1 缺失值处理。

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

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

2 删除缺失率较大的列(初步处理时)

Cabin列的缺失率达到了75%,删除改列。

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

3 特征处理

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

1)单变量特征提取。

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

观察name列

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

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

2)多变量的组合

sibsp 代表兄弟姐妹和配偶的数量

parch 代表父母和子女的数量

因此可以将sibsp和parch结合获得家庭成员的数量

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

3)名义变量转数值变量

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

4)数据分段

根据统计信息和经验分段

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

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

4 模型选择与测试

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

RandomForestClassifier

ExtraTreesClassifier

AdaBoostClassifier

GradientBoostingClassifier

SVC

模型参数:

  1. #随机森林 
  2.     rf_params = { 
  3.         'n_jobs': -1, 
  4.         'n_estimators': 500, 
  5.         'warm_start'True
  6.         # 'max_features': 0.2, 
  7.         'max_depth': 6, 
  8.         'min_samples_leaf': 2, 
  9.         'max_features''sqrt'
  10.         'verbose': 0 
  11.     } 
  12.     # Extra Trees 随机森林 
  13.     et_params = { 
  14.         'n_jobs': -1, 
  15.         'n_estimators': 500, 
  16.         # 'max_features': 0.5, 
  17.         'max_depth': 8, 
  18.         'min_samples_leaf': 2, 
  19.         'verbose': 0 
  20.     } 
  21.  
  22.     # AdaBoost  
  23.     ada_params = { 
  24.         'n_estimators': 500, 
  25.         'learning_rate': 0.75 
  26.     } 
  27.  
  28.     # GBDT 
  29.     gb_params = { 
  30.         'n_estimators': 500, 
  31.         # 'max_features': 0.2, 
  32.         'max_depth': 5, 
  33.         'min_samples_leaf': 2, 
  34.         'verbose': 0 
  35.     } 
  36.  
  37.     # SVC 
  38.     svc_params = { 
  39.         'kernel''linear'
  40.         'C': 0.025 
  41.     } 

模型选择代码:

  1. classifiers = [ 
  2.         ("rf_model", RandomForestClassifier(**rf_params)), 
  3.         ("et_model", ExtraTreesClassifier(**et_params)), 
  4.         ("ada_model", AdaBoostClassifier(**ada_params)), 
  5.         ("gb_model", GradientBoostingClassifier(**gb_params)), 
  6.         ("svc_model", SVC(**svc_params)), 
  7.     ] 
  8.  
  9.     heldout = [0.95, 0.90, 0.75, 0.50, 0.01] 
  10.     rounds = 20 
  11.     xx = 1. - np.array(heldout) 
  12.     for name, clf in classifiers: 
  13.         print("training %s" % name
  14.         rng = np.random.RandomState(42) 
  15.         yy = [] 
  16.         for i in heldout: 
  17.             yy_ = [] 
  18.             for r in range(rounds): 
  19.                 X_train_turn, X_test_turn, y_train_turn, y_test_turn = \ 
  20.                     train_test_split(x_train, labels_train, test_size=i, random_state=rng) 
  21.                 clf.fit(X_train_turn, y_train_turn) 
  22.                 y_pred = clf.predict(X_test_turn) 
  23.                 yy_.append(1 - np.mean(y_pred == y_test_turn)) 
  24.             yy.append(np.mean(yy_)) 
  25.         plt.plot(xx, yy, label=name
  26.  
  27.     plt.legend(loc="upper right"
  28.     plt.xlabel("Proportion train"
  29.     plt.ylabel("Test Error Rate"
  30.     plt.show() 

选择结果如下:

从上图可以看出,randomForest的一般表现要优于其他算法。初步选择randomforest算法。

模型的在训练集上的表现:

  1. def modelScore(x_train,labels_train,x_test,y_test,model_name,et_params): 
  2.     print("--------%s------------")%(model_name) 
  3.     model = model_name(**et_params) 
  4.  
  5.     model.fit(x_train, labels_train) 
  6.     if "feature_importances_" in dir(model): 
  7.         print model.feature_importances_ 
  8.  
  9.     print classification_report( 
  10.         labels_train, 
  11.         model.predict(x_train)) 
  12.  
  13.     print classification_report( 
  14.         y_test, 
  15.         model.predict(x_test)) 
  16.     return model 
  17.  
  18. modelScore(x_train, labels_train, x_test, y_test, RandomForestClassifier, rf_params) 

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

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

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

原文链接:https://cloud.tencent.com/community/article/229506

作者:赵成龙

【本文是51CTO专栏作者“腾讯云技术社区”的原创稿件,转载请通过51CTO联系原作者获取授权】

戳这里,看该作者更多好文

sklearn 机器学习 pandas
上一篇:15个统计数字解读人工智能前景 下一篇:神经网络求解新思路:OpenAI用线性网络计算非线性问题
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

用机器学习备忘单解决艰巨问题,你行吗?

在本文中,我们将介绍如何使用备忘单简化机器学习方法,你可以使用该备忘单选择适合解决问题的正确算法。

读芯术 ·  2天前
“阿凡达”式脑-脑接口性能提升 2-3 个数量级

脑-脑接口这一概念,看过科幻电影《阿凡达》的人可能有点印象。在电影中,地球上的人可以通过脑对脑的直接信息传递,远程控制潘多拉星上经基因改造的蓝色类人生物 Na'vi 族。

付静 ·  2020-03-26 10:42:31
探究谷歌用于构建量子机器学习模型的新框架:TensorFlow Quantum

TensorFlow Quantum让数据科学家可以构建在量子架构上运行的机器学习模型。TensorFlow Quantum的核心概念是将量子算法和机器学习程序交织在TensorFlow编程模型中。谷歌称这种方法为量子机器学习,能够利用其最近的一些量子计算框架(比如谷歌Cirq)来实现它。

布加迪 ·  2020-03-26 08:00:00
算法之外:人工智能和机器学习对组织的影响

如今,数字科学对于企业来说,显得愈发地“诱人”。但是若要正确地看待数字科学,我们亟需了解下面一个问题:数字科学到底能为我们的业务发展做什么,不能为我们的业务发展做什么。

IMD商学院 ·  2020-03-24 15:15:54
韩松、朱俊彦等人提出GAN压缩法:算力消耗不到1/9,现已开源

近日,来自麻省理工学院(MIT)、Adobe、上海交通大学的研究者提出了一种用于压缩条件 GAN 的通用方法。这一新技术在保持视觉保真度的同时,将 pix2pix,CycleGAN 和 GauGAN 等广泛使用的条件 GAN 模型的计算量减少到 1/9~1/21。

Muyang Li等 ·  2020-03-23 15:10:49
五大方面:机器学习如何在不久的将来改变教育

如果你目前在学校或者在教育领域工作,那么对即将到来的变化有所了解是非常必要的。在这篇文章中,我们将探讨机器学习在未来几年改善教育的五种途径。

读芯术 ·  2020-03-23 07:18:22
互联网上20大免费数据科学、机器学习和人工智能慕课

现在是2020年,数据科学比以往更加民主化。这意味着任何个人只要有适当的工具和大量的数据,就可以在几乎没有专业知识的情况下进行数据科学研究。随着数据渗透到整个行业的每一个角落,拥有数据科学家的技能是大势所趋,也因此产生了一支会说数据语言的员工队伍。

读芯术 ·  2020-03-22 16:11:48
人工智能机器学习常用算法总结及各个常用算法精确率对比

本文讲解了机器学习常用算法总结和各个常用分类算法精确率对比。收集了现在比较热门的TensorFlow、Sklearn,借鉴了Github和一些国内外的文章。

程序员陈平安 ·  2020-03-20 11:22:09
Copyright©2005-2020 51CTO.COM 版权所有 未经许可 请勿转载