基于Python和Scikit-Learn的机器学习探索


Posted in Python onOctober 16, 2017

你好,%用户名%!

我叫Alex,我在机器学习和网络图分析(主要是理论)有所涉猎。我同时在为一家俄罗斯移动运营商开发大数据产品。这是我第一次在网上写文章,不喜勿喷。

现在,很多人想开发高效的算法以及参加机器学习的竞赛。所以他们过来问我:”该如何开始?”。一段时间以前,我在一个俄罗斯联邦政府的下属机构中领导了媒体和社交网络大数据分析工具的开发。我仍然有一些我团队使用过的文档,我乐意与你们分享。前提是读者已经有很好的数学和机器学习方面的知识(我的团队主要由MIPT(莫斯科物理与技术大学)和数据分析学院的毕业生构成)。

这篇文章是对数据科学的简介,这门学科最近太火了。机器学习的竞赛也越来越多(如,Kaggle, TudedIT),而且他们的资金通常很可观。

R和Python是提供给数据科学家的最常用的两种工具。每一个工具都有其优缺点,但Python最近在各个方面都有所胜出(仅为鄙人愚见,虽然我两者都用)。这一切的发生是因为Scikit-Learn库的腾空出世,它包含有完善的文档和丰富的机器学习算法。
请注意,我们将主要在这篇文章中探讨机器学习算法。通常用Pandas包去进行主数据分析会比较好,而且这很容易你自己完成。所以,让我们集中精力在实现上。为了确定性,我们假设有一个特征-对象矩阵作为输入,被存在一个*.csv文件中。

数据加载

首先,数据要被加载到内存中,才能对其操作。Scikit-Learn库在它的实现用使用了NumPy数组,所以我们将用NumPy来加载*.csv文件。让我们从UCI Machine Learning Repository下载其中一个数据集。

import numpy as np
import urllib
# url with dataset
url = “http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data”
# download the file
raw_data = urllib.urlopen(url)
# load the CSV file as a numpy matrix
dataset = np.loadtxt(raw_data, delimiter=“,”)
# separate the data from the target attributes
X = dataset[:,0:7]
y = dataset[:,8]

我们将在下面所有的例子里使用这个数据组,换言之,使用X特征物数组和y目标变量的值。

数据标准化

我们都知道大多数的梯度方法(几乎所有的机器学习算法都基于此)对于数据的缩放很敏感。因此,在运行算法之前,我们应该进行标准化,或所谓的规格化。标准化包括替换所有特征的名义值,让它们每一个的值在0和1之间。而对于规格化,它包括数据的预处理,使得每个特征的值有0和1的离差。Scikit-Learn库已经为其提供了相应的函数。

from sklearn
import metrics
from sklearn.ensemble
import ExtraTreesClassifier
model = ExtraTreesClassifier()
model.fit(X, y)# display the relative importance of each attribute
print(model.feature_importances_)

特征的选取

毫无疑问,解决一个问题最重要的是是恰当选取特征、甚至创造特征的能力。这叫做特征选取和特征工程。虽然特征工程是一个相当有创造性的过程,有时候更多的是靠直觉和专业的知识,但对于特征的选取,已经有很多的算法可供直接使用。如树算法就可以计算特征的信息量。

from sklearn
import metrics
from sklearn.ensemble
import ExtraTreesClassifier
model = ExtraTreesClassifier()
model.fit(X, y)# display the relative importance of each attribute
print(model.feature_importances_)

其他所有的方法都是基于对特征子集的高效搜索,从而找到最好的子集,意味着演化了的模型在这个子集上有最好的质量。递归特征消除算法(RFE)是这些搜索算法的其中之一,Scikit-Learn库同样也有提供。

from sklearn.feature_selection
import RFE
from sklearn.linear_model
import LogisticRegression
model = LogisticRegression()# create the RFE model and select 3 attributes
rfe = RFE(model, 3)
rfe = rfe.fit(X, y)# summarize the selection of the attributes
print(rfe.support_)
print(rfe.ranking_)

算法的开发

正像我说的,Scikit-Learn库已经实现了所有基本机器学习的算法。让我来瞧一瞧它们中的一些。

逻辑回归

大多数情况下被用来解决分类问题(二元分类),但多类的分类(所谓的一对多方法)也适用。这个算法的优点是对于每一个输出的对象都有一个对应类别的概率。

from sklearn
import metrics
from sklearn.linear_model
import LogisticRegression
model = LogisticRegression()
model.fit(X, y)
print(model)# make predictions
expected = y
predicted = model.predict(X)# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

朴素贝叶斯

它也是最有名的机器学习的算法之一,它的主要任务是恢复训练样本的数据分布密度。这个方法通常在多类的分类问题上表现的很好。

from sklearn
import metrics
from sklearn.naive_bayes
import GaussianNB
model = GaussianNB()
model.fit(X, y)
print(model)# make predictions
expected = y
predicted = model.predict(X)# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

k-最近邻

kNN(k-最近邻)方法通常用于一个更复杂分类算法的一部分。例如,我们可以用它的估计值做为一个对象的特征。有时候,一个简单的kNN

from sklearn
import metrics
from sklearn.neighbors
import KNeighborsClassifier# fit a k - nearest neighbor model to the data
model = KNeighborsClassifier()
model.fit(X, y)
print(model)# make predictions
expected = y
predicted = model.predict(X)# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

决策树

分类和回归树(CART)经常被用于这么一类问题,在这类问题中对象有可分类的特征且被用于回归和分类问题。决策树很适用于多类分类。

from sklearn
import metrics
from sklearn.tree
import DecisionTreeClassifier# fit a CART model to the data
model = DecisionTreeClassifier()
model.fit(X, y)
print(model)# make predictions
expected = y
predicted = model.predict(X)# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

支持向量机

SVM(支持向量机)是最流行的机器学习算法之一,它主要用于分类问题。同样也用于逻辑回归,SVM在一对多方法的帮助下可以实现多类分类。

from sklearn import metrics
from sklearn.svm import SVC
# fit a SVM model to the data
model = SVC()
model.fit(X, y)
print(model)
# make predictions
expected = y
predicted = model.predict(X)
# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

除了分类和回归问题,Scikit-Learn还有海量的更复杂的算法,包括了聚类, 以及建立混合算法的实现技术,如Bagging和Boosting。

如何优化算法的参数

在编写高效的算法的过程中最难的步骤之一就是正确参数的选择。一般来说如果有经验的话会容易些,但无论如何,我们都得寻找。幸运的是Scikit-Learn提供了很多函数来帮助解决这个问题。

作为一个例子,我们来看一下规则化参数的选择,在其中不少数值被相继搜索了:

import numpy as np
from sklearn.linear_model
import Ridge
from sklearn.grid_search
import GridSearchCV# prepare a range of alpha values to test
alphas = np.array([1, 0.1, 0.01, 0.001, 0.0001, 0])# create and fit a ridge regression model, testing each alpha
model = Ridge()
grid = GridSearchCV(estimator = model, param_grid = dict(alpha = alphas))
grid.fit(X, y)
print(grid)# summarize the results of the grid search
print(grid.best_score_)
print(grid.best_estimator_.alpha)

有时候随机地从既定的范围内选取一个参数更为高效,估计在这个参数下算法的质量,然后选出最好的。

import numpy as np
from scipy.stats
import uniform as sp_rand
from sklearn.linear_model
import Ridge
from sklearn.grid_search
import RandomizedSearchCV# prepare a uniform distribution to sample
for the alpha parameter
param_grid = {‘
  alpha': sp_rand()
}#
create and fit a ridge regression model, testing random alpha values
model = Ridge()
rsearch = RandomizedSearchCV(estimator = model, param_distributions = param_grid, n_iter = 100)
rsearch.fit(X, y)
print(rsearch)# summarize the results of the random parameter search
print(rsearch.best_score_)
print(rsearch.best_estimator_.alpha)

至此我们已经看了整个使用Scikit-Learn库的过程,除了将结果再输出到一个文件中。这个就作为你的一个练习吧,和R相比Python的一大优点就是它有很棒的文档说明。

总结

以上就是本文关于基于Python和Scikit-Learn的机器学习探索的全部内容,感兴趣的朋友可以参阅:python 排序算法总结及实例详解、Java 蒙特卡洛算法求圆周率近似值实例详解、Java常见数据结构面试题(带答案)以及本站其他相关专题,如有不足之处,欢迎留言指出,小编一定及时回复大家并改正,为广大编程爱好者提供更优质的文章以及更好的帮助,感谢朋友们对本站的支持!

Python 相关文章推荐
批量获取及验证HTTP代理的Python脚本
Apr 23 Python
Python操作SQLite数据库的方法详解
Jun 16 Python
深入理解Python中的super()方法
Nov 20 Python
使用Python+wxpy 找出微信里把你删除的好友实例
Feb 21 Python
python实现文件的备份流程详解
Jun 18 Python
python 数据提取及拆分的实现代码
Aug 26 Python
利用python-docx模块写批量生日邀请函
Aug 26 Python
Python中注释(多行注释和单行注释)的用法实例
Aug 28 Python
tensorboard显示空白的解决
Feb 15 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
解决tensorflow/keras时出现数组维度不匹配问题
Jun 29 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 Python
python版简单工厂模式
Oct 16 #Python
Python实现扩展内置类型的方法分析
Oct 16 #Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 #Python
python利用paramiko连接远程服务器执行命令的方法
Oct 16 #Python
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 #Python
python中文件变化监控示例(watchdog)
Oct 16 #Python
python中import reload __import__的区别详解
Oct 16 #Python
You might like
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
php unlink()函数使用教程
2018/07/12 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
初学JavaScript第二章
2008/09/30 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
用javascript将数据导入Excel示例代码
2014/09/10 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
分分钟入门python语言
2018/03/20 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
中药专业毕业自荐书范文
2014/02/08 职场文书
体育活动总结范文
2014/05/04 职场文书
单位承诺书格式
2014/05/21 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript
JavaScript文档对象模型DOM
2021/11/20 Javascript
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers