python机器学习使用sklearn模块出错,求解答

python机器学习使用sklearn模块出错,求解答_百度知道概要:该章节,我们将介绍贯穿scikit-learn使用中的“机器学习(Machine Learning)”这个词汇,并给出一些简单的学习示例。一、机器学习:问题设定通常,一个学习问题是通过分析一些数据样本来尝试预测未知数据的属性。如果每一个样本不仅仅是一个单独的数字,比如一个多维的实例(multivariate data),也就是说有着多个属性特征我们可以把学习问题分成如下的几个大类:(1)有监督学习数据带有我们要预测的属性。这种问题主要有如下几种:①分类样例属于两类或多类,我们想要从已经带有标签的数据学习以预测未带标签的数据。识别手写数字就是一个分类问题,这个问题的主要目标就是把每一个输出指派到一个有限的类别中的一类。另一种思路去思考分类问题,其实分类问题是有监督学习中的离散形式问题。每一个都有一个有限的分类。对于样例提供的多个标签,我们要做的就是把未知类别的数据划分到其中的一种。②回归去过预期的输出包含连续的变量,那么这样的任务叫做回归。根据三文鱼的年纪和中联预测其长度就是一个回归样例。(2)无监督学习训练数据包含不带有目标值的输入向量x。对于这些问题,目标就是根据数据发现样本中相似的群组——聚类。或者在输入空间中判定数据的分布——密度估计,或者把数据从高维空间转换到低维空间以用于可视化训练集和测试集机器学习是学习一些数据集的特征属性并将其应用于新的数据。这就是为什么在机器学习用来评估算法时一般把手中的数据分成两部分。一部分我们称之为训练集,用以学习数据的特征属性。一部分我们称之为测试集,用以检验学习到的特征属性。二、加载一个样本数据集scikit-learn带有一些标准数据集。比如用来分类的iris数据集、digits数据集;用来回归的boston house price 数据集。接下来,我们我们从shell开启一个Python解释器并加载iris和digits两个数据集。【译注:一些代码惯例就不写了,提示符&&&之类的学过Python的都懂】$ python
&&&from sklearn import datasets
&&&iris = datasets.load_iris()
&&&digits = datasets.load_digits()一个数据集是一个包含数据所有元数据的类字典对象。这个数据存储在 ‘.data’成员变量中,是一个$n*n$的数组,行表示样例,列表示特征。在有监督学习问题中,一个或多个响应变量(Y)存储在‘.target’成员变量中。不同数据集的更多细节可以在dedicated section中找到。例如,对于digits数据集,digits.data可以访问得到用来对数字进行分类的特征:&&&print(digits.data)
0.]]digits.target 就是数字数据集对应的真实数字值。也就是我们的程序要学习的。&&&digits.target
array([0, 1, 2, ..., 8, 9, 8])数据数组的形状尽管原始数据也许有不同的形状,但实际使用的数据通常是一个二维数组(n个样例,n个特征)。对于数字数据集,每一个原始的样例是一张(8 x 8)的图片,也能被使用:&&&digits.images[0]
0.]])三、学习和预测对于数字数据集(digits dataset),任务是预测一张图片中的数字是什么。数字数据集提供了0-9每一个数字的可能样例,可以用它们来对位置的数字图片进行拟合分类。在scikit-learn中,用以分类的拟合(评估)函数是一个Python对象,具体有fit(X,Y)和predic(T)两种成员方法。其中一个拟合(评估)样例是sklearn.svmSVC类,它实现了支持向量分类(SVC)。一个拟合(评估)函数的构造函数需要模型的参数,但是时间问题,我们将会把这个拟合(评估)函数作为一个黑箱:&&&from sklearn import svm
&&&clf = svm.SVC(gamma=0.001, C=100.)选择模型参数我们调用拟合(估测)实例clf作为我们的分类器。它现在必须要拟合模型,也就是说,他必须要学习模型。这可以通过把我们的训练集传递给fit方法。作为训练集,我们使用其中除最后一组的所有图像。我们可以通过Python的分片语法[:-1]来选取训练集,这个操作将产生一个新数组,这个数组包含digits.dataz中除最后一组数据的所有实例。&&&clf.fit(digits.data[:-1], digits.target[:-1])
SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,
gamma=0.001, kernel='rbf', max_iter=-1, probability=False,
random_state=None, shrinking=True, tol=0.001, verbose=False)现在你可以预测新的数值了。我们可以让这个训练器告诉我们digits数据集我们没有作为训练数据使用的最后一张图像是什么数字。&&&clf.predict(digits.data[-1])
array([8])相应的图片如下图:正如你所看到的,这是一个很有挑战的任务:这张图片的分辨率很低。你同意分类器给出的答案吗?这个分类问题的完整示例在这里识别手写数字,你可以运行并使用它。[译:看本文附录]四、模型持久化可以使用Python的自带模块——pickle来保存scikit中的模型:&&&from sklearn import svm
&&&from sklearn import datasets
&&&clf = svm.SVC()
&&&iris = datasets.load_iris()
&&&X, y = iris.data, iris.target
&&&clf.fit(X, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,
kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
&&&import pickle
&&&s = pickle.dumps(clf)
&&&clf2 = pickle.loads(s)
&&&clf2.predict(X[0])
array([0])
&&&y[0]0对于scikit,也许使用joblib的pickle替代——(joblib.dump&joblib.load)更有趣。因为它在处理带数据时更高效。但是遗憾的是它只能把数据持久化到硬盘而不是一个字符串(译注:搬到string字符串意味着数据在内存中):&&&from sklearn.externals import joblib
&&&joblib.dump(clf, 'filename.pkl')往后你就可以加载这个转储的模型(也能在另一个Python进程中使用),如下:&&&clf = joblib.load('filename.pkl')注意:joblib.dump返回一个文件名的列表,每一个numpy数组元素包含一个clf在文件系统上的名字,在用joblib.load加载的时候所有的文件需要在相同的文件夹下注意pickle有一些安全和可维护方面的问题。请参考Model persistent 获得在scikit-learn中模型持久化的细节。五、惯例约定scikit-learn的各种拟合(评估)函数遵循一些确定的规则以使得他们的用法能够被预想到(译:使得各种学习方法的用法统一起来)①类型转换除非特别指定,输入将被转换为float64import numpyfrom sklearn import random_projection
rng = np.random.RandomState(0)
X = rng.rand(10,2000)
X = np.array(X,dtype ='float32')print x.dtype
transformer = random_projection.GaussianRandomProjection()
X_new = transformer.fit_transform(X)print X_new.dtype在这个例子中,X是float32,被fit_transform(X)转换成float64,回归被转换成float64,分类目标维持不变.from sklearn import datesetsfrom sklearn.svm import SVC
iris = datasets.load_iris()
clf =SVC()
clf.fit(iris.data,iris.target)print list(clf.predict(iris.data[:3]))
clf.fit(iris.data,iris.target_names[iris.target])print list(clf.predict(iris.data[:3]))这里第一个predict()返回一个整数数组,是因为iris.target(一个整数数组)被用于拟合。第二个predict()返回一个字符串数组,因为iris.target_names被用于拟合。②重拟合和更新参数一个拟合(评估)函数的混合参数(超参数)能够在通过sklearn.pipeline.Pipeline.set_params方法构造之后被更新。多次调用fit()能够覆写之前fit()学习的内容:import numpy as npfrom sklearn.svm import SVC
rng = np.random.RandomState(0);
X = rng.rand(100,10)
Y = rng.binomial(1,0.5,100)
X_test = rng.rand(5,10)
clf = SVC()
clf.set_params(kernel = 'linear').fit(X,Y)
clf.predict(X_test)
clf.set_params(kernel='rbf').fit(X,Y)
clf.predict(X_test) 这里,用SVC()构造之后,开始拟合(评估)函数默认的’rbf’核被改编成’linear’,后来又改回’rbf’去重拟合做第二次的预测。附:①digits数据集:一个展示怎样用scikit-learn识别手写数字的样例:绘制数字:from sklearn import datasetsimport matplotlib.pyplot as pltdigits = datasets.load_digits()plt.figure(1, figsize=(3, 3))
plt.imshow(digits.images[-1], cmap=plt.cm.gray_r, interpolation='nearest')
plt.show()②绘制数字分类 (plot_digits_classification.py)import matplotlib.pyplot as pltfrom sklearn import datasets, svm, metricsdigits = datasets.load_digits()images_and_labels = list(zip(digits.images, digits.target))for index, (image, label) in enumerate(images_and_labels[:4]):
plt.subplot(2, 4, index + <span class="hljs-number" style="margin: 0 padding: 0 max-width: 100%; box-sizing: border- word-wrap: break-word !"数据科学自媒体(DataScienceWeMedia) 
 文章为作者独立观点,不代表微头条立场
的最新文章
读懂Hadoop/HBase/Hive/Spark分布式系统架构,数据人QQ群:(温馨提示,入群者请需要数据人网账号【注册数据人网邮箱】)支持向量机学习,数据人QQ群:Python做机器学习,数据人QQ群:回归分析是建模和分析数据的重要工具。本文解释了回归分析的内涵及其优势,重点总结了应该掌握的线性回归、逻辑回归、多项式回归、逐步回归、岭回归、套索回归、ElasticNet回归等七种最常用的回归技术及其关键要素.朴素贝叶斯分类算法,中国数据人QQ群:坐标:上海微盟:C轮创业公司,投资方包含腾讯、海航等实力资本,拥有toB和toC的电商业务,广告和理财为蓄力随着互联网的迅猛发展,在线学习逐渐成为主流,MOOC、慕课等概念如雨后春笋般涌现。以往高等学府才能接触到的计Hadoop框架及生态技术介绍,数据人网【http://shujuren.org】推荐。数据科学团队自测题,测试一下,有何感想。什么叫数据敏感?怎样做数据分析?机器学习两次浪潮|数据人网(http://shujuren.org)(I)特征工程可以解决什么样的问题?特征工程是一个非常重要的课题,是机器学习中不可缺少的一部分,但是它几乎很一个优秀的产品经理做数据分析机器学习10个基础算法机器学习决策树数据人网专注于从数据中学习。您要什么资料,您有什么问题,请加小编微信:luqin360。数据人网是数据人学习、交流和分享的平台。http://shujuren.org大数据时代,努力成为数据人才。数据人网分享数据知识,助你成才。http://shujuren.org数据科学,21世纪最新感的职业。数据人网是数据人学习、交流和 分享的平台。http://shujuren.org!!
做数据挖掘也有些年头了,写这篇文一方面是写篇文,给有个朋友作为数据挖MIT一牛人对数学在机器学习中的作用给的评述,写得很实际机器学习和计算机视觉都是很多种数学的交汇场。看着不同买芒果嘴馋的你想吃芒果了,于是你走到水果摊,挑了几个让老板过过秤,然后你再根据芒果的斤两付钱走人。显然,买芒
从事数据挖掘工作,尤其是在互联网行业,主要需要三个方面的能力,即机器首先,假设你知道训练集和测试集的关系。简单来讲是我们要在训练集上学习一个模型,然后拿到测试集去用,效果好不好
你知道如何为你的分类问题选择合适的机器学习算法吗?当然,如果你真正
环境ubuntu 12.04, 64 bitspython 2.7sklearn 0.14准备sklearn现在,了解机器学习领域到底在什么方面是如此吸引人的是很重要的。了解为什么现在机器学习很流行可以作为你学习、研日,精疲力竭的卡斯帕罗夫在IBM的“深蓝”面前停钟认输,这是对人类智慧的一次沉重打击。“但在这篇文章中,我要带大家预览一下机器学习中最热门的算法。预览主要的机器学习算法可在某种程度上给你这样的一种感读书之法,在循序而渐进,熟读而精思。——朱熹O’Reilly 媒体 总经理 Jim Stogdill 倾情作[摘要]医疗、机器人、图像识别等领域均有代表公司。腾讯科技讯 12月27日,据外媒消息,纵观即将过去的一年,在一份调查问卷中,三个独立专家小组投票选出的十大最有影响力的数据挖掘算法,今天我打算用简单的语言来解释一下。在当今的大数据时代,利用数据科学理论进行数据分析起着越来越重要的作用。探讨不同数据技巧类型和熟练程度对相关项近期,美国互联网金融公司ZestFinance受到国内互联网金融专业人士的热捧,其基于大数据的信用评估模型也
基于用户行为分析定向网络广告投放来源:SAS中文论坛近些年来,人工智能领域又活跃起来,除了传统了学术圈外,Google、Microsoft、facebook等工深度学习是近十年来人工智能领域取得的最重要的突破之一。它在语音识别、自然语言处理、计算机视觉、图像与视频分析机器学习是数据科学的发动机。每种机器学习方法(也称为算法)获取数据,反复咀嚼,输出结果。机器学习算法负责数据神经网络框架变得越来越复杂而精密在感知、语言翻译等等方面的大部分最先进的神经网络框架正在发展并且不在仅仅关于深度学习 Deep Learning 学习资料汇编 (持续更新中)。欢迎补充。入门阅读deep learni本文详细列举了从雇主角度看来,数据科学家加强自身市场竞争力所必备的9个数据科学技能。过去一年中人们对数据科学机器学习淘金热正在到来!Libby Kinsey 是 Nesta 资本的投资经理,关注技术创新已经有 12 机器学习是目前数据分析领域的一个热点内容,在平时的学习和生活中经常会用到各种各样的机器学习算法。实际上,基于深度学习(Deep Learning)属于非常前沿的学科,没有现成的的综合型教材,主要是通过阅读大量论文和代近些年来,人工智能领域又活跃起来,除了传统了学术圈外,Google、Microsoft、facebook等工
基于用户行为分析定向网络广告投放来源:SAS中文论坛大家好我是吴炜,目前在阿里巴巴主要从事点击率预估和相关性方面的数据挖掘工作。今天给大家带来的主题《深度学习原本文作者是 Codecademy 的分析主管 Cheng-TaoChu,其专长是数据挖掘和机器学习,之前在很久没写东西了,正好群里有童鞋最近要换工作,提到有关数据库方面的问题,个人认为,做数据分析的并没有必要把数神经网络和机器学习在过去几年一直是高科技领域最热门的话题之一。这一点很容易看出,因为它们解决了很多真正有趣的用例,如语音识别、图像识别、甚至是乐曲谱写。本文总结了一些很好的Python机器学习库的清单。DataScienceWeMedia【数据科学自媒体】,分享数据科学干货,让更多朋友认识数据科学和利用数据科学!!欢迎关注【DataScienceWeMedia】热门文章最新文章DataScienceWeMedia【数据科学自媒体】,分享数据科学干货,让更多朋友认识数据科学和利用数据科学!!欢迎关注【DataScienceWeMedia】温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
在之前已经有使用机器学习方法进行情感分类了,现在是提取各种可能影响评论有用性的特征之后对文本进行分类。我分析的数据是手机商品评论,看看我提取了些什么特征(特征和情感分类的特征不一样了。情感分类使用的是词来做特征,但这里用的是已经计算出的各项数值作为特征)。我提取了(一条评论中的)1.手机名字出现次数;2. 手机品牌出现次数;3. 手机的属性(如屏幕、速度、拍照等);4. 评论的词数;5. 评论的句子数;6. 形容词数;7. 副词数;8. 动词数;9. 平均每句的词数;10. 信息熵;11. 困惑值;12. 积极情感概率;13. 消极情感概率;14. 积极词典匹配总分值;15. 消极情感匹配总分值;16. 积极分值的均值;17. 积极分值的方差;18. 消极分值均值;19. 消极分值方差;20. 评论与商品描述之间的tf-idf 相似度。这20个数值特征用来帮助我进行评论有用性的分类。因为我假设这20个特征都能有效识别一条评论是否是“有用的”。要进行有监督的机器学习,就还需要为每条评论添加类标签,类标签既这条评论是“有用”或“没用”。这个可以人工标注的方法来标注,既人为的阅读评论然后标注评论。把“有用”标记为“1”,把“没用”标记为“0”。在提取了特征和类标签之后存储在txt 文档中,形式如下:第一列为类标签,既表示“有用”的“1”和表示“没用”的“0”。其它的列都是提取出来的分类特征。========================================================================接下来就可以把数据导入Python,然后使用scikit-learn 进行分类了。但使用scikit-learn ,需要先了解一点关于numpy 的知识。因为scikit-learn 进行机器学习时的数据的类型是numpy 的矩阵结构。其实要了解的主要是numpy 的矩阵取值方式,有非常清楚的图,我直接拿来用了。&numpy 矩阵a有56个元素,取值从0到55。可以看到不同的索引切片方式可以怎么取到不同的值。其切片形式主要为:矩阵[ 第n行:第m行, 第p列:第q列 ]一、现在可以把特征和类标签的数据导入Python了。import numpy as npf = open('D:/code/Machine Learning/features.txt')f.readline()data = np.loadtxt(f) #把数据载入Python 之后,用numpy 的数据类型存储起来二、用随机函数打乱数据,防止分类的时候重复训练测测试一样的数据。from random import shuffleshuffle(data)三、把数据分割为开发集和测试集。development = data[:4000,:] #4000个数据作为开发集test = data[4000:,:] #剩余的小部分数据作为测试集train = development[:,1:]tag = development[:, 0] #第一列是类标签四、载入分类算法,把分类算法传递给一个变量。import sklearnfrom sklearn import svmfrom sklearn.linear_model import LogisticRegressionfrom sklearn.naive_bayes import GaussianNBsvc = svm.SVC(gamma=0.001, C=100.)lr = LogisticRegression(penalty='l1', tol=0.01)gnb = GaussianNB()五、使用交叉检验的方法测试分类器的准确度。交叉检验简单来说就是把数据平均分成n 份,其中n-1 份作为训练集,1份作为测试集,得出一个分类精度。重复n 次,得出n 个分类精度。然后n 次分类精度的平均精度就是最终的分类准确度。具体如图所示(5折交叉检验):&使用交叉检验可以有效消除一次检验所带来的波动,得出比较合理的分类准确度。from sklearn import cross_validationkfold = cross_validation.KFold(len(x1), n_folds=10)此处使用的是10折交叉检验,既把数据分成10份,其中9份为训练集,1份为测试集。重复10次。六、使用交叉检验测试不同分类器的准确率。svc_accuracy = cross_validation.cross_val_score(svc, train, tag, cv=kfold)lr_accuracy = cross_validation.cross_val_score(lr, train, tag, cv=kfold)gnb_accuracy = cross_validation.cross_val_score(gnb, train, tag, cv=kfold)print 'SVM average accuary: %f' %svc_accuracy.mean()print 'LogisticRegression average accuary: %f' %lr_accuracy.mean()print 'Naive Bayes average accuary: %f' %gnb_accuracy.mean()结果如下:SVM average accuary: 0.877000Logisic regression average accuracy: 0.734333Naive Bayes average accuracy: 0.686333接下来还有:除了准确率这一个分类器效果检验指标之外,还有ROC曲线和AUC(ROC曲线下的面积)。这两个指标也可以检验分类器效果。这两个指标用scikit-learn 也不难实现。选择最佳分类器之后用测试集检验其最终分类效果。使用最佳分类器进行分类。使用不同的特征组合进行分类,寻找最优的特征组合。最优特征组合是对分类识别率最高的因素。未完待续。。。
阅读(6435)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'Python 文本挖掘:使用scikit-learn 机器学习包进行文本分类',
blogAbstract:'我做的项目是对评论进行有用性(helpfulness)分类,把评论分成有用和没用两类。在之前已经有使用机器学习方法进行情感分类了,现在是提取各种可能影响评论有用性的特征之后对文本进行分类。我分析的数据是手机商品评论,看看我提取了些什么特征(特征和情感分类的特征不一样了。情感分类使用的是词来做特征,但这里用的是已经计算出的各项数值作为特征)。我提取了(一条评论中的)1.手机名字出现次数;2. 手机品牌出现次数;3. 手机的属性(如屏幕、速度、拍照等);4. 评论的词数;5. 评论的句子数;6. 形容词数;7. 副词数;8. 动词数;9. 平均每句的词数;10. 信息熵;11. 困惑值;12. 积极情感概率;13. 消极情感概率;14. 积极词典匹配总分值;15. 消极情感匹配总分值;16. 积极分值的均值;17.',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:9,
publishTime:3,
permalink:'blog/static/',
commentCount:12,
mainCommentCount:8,
recommendCount:3,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}9028人阅读
Python(24)
计算机视觉(57)
1 首先需要安装Cython,网上后进行本地安装 python setup.py install
2 下载Sklearn包,&,进行本地安装(使用pip或easy_install总是出错,如can not import murmurhash3_32,最终本地安装成功)
3 安装后可用nosetests -v sklearn来进行测试
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:783054次
积分:7845
积分:7845
排名:第1779名
原创:87篇
转载:159篇
评论:208条
阅读:11756
阅读:30974
(2)(4)(2)(3)(2)(1)(1)(5)(1)(1)(2)(6)(10)(10)(3)(1)(1)(1)(8)(1)(4)(6)(1)(12)(9)(1)(20)(4)(4)(4)(1)(3)(19)(8)(1)(1)(4)(2)(8)(9)(1)(1)(8)(11)(8)(5)(7)(6)(1)使用sklearn做单机特征工程_python_ThinkSAAS
使用sklearn做单机特征工程
使用sklearn做单机特征工程
1 特征工程是什么?2 数据预处理  2.1 无量纲化    2.1.1 标准化    2.1.2 区间缩放法    2.1.3 无量纲化与正则化的区别  2.2 对定量特征二值化  2.3 对定性特征哑编码  2.4 缺失值计算  2.5 数据变换  2.6 回顾3 特征选择  3.1 Filter    3.1.1 方差选择法    3.1.2 相关系数法    3.1.3 卡方检验    3.1.4 互信息法   3.2 Wrapper     3.2.1 递归特征消除法  3.3 Embedded    3.3.1 基于惩罚项的特征选择法    3.3.2 基于树模型的特征选择法  3.4 回顾4 降维  4.1 主成分分析法(PCA)  4.2 线性判别分析法(LDA)  4.3 回顾5 总结6 参考资料&#13;
1 特征工程是什么?&#13;
  有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。通过总结和归纳,人们认为特征工程包括以下方面:&#13;
  特征处理是特征工程的核心部分,sklearn提供了较为完整的特征处理方法,包括数据预处理,特征选择,降维等。首次接触到sklearn,通常会被其丰富且方便的算法模型库吸引,但是这里介绍的特征处理库也十分强大!&#13;
  本文中使用sklearn中的来对特征处理功能进行说明。IRIS数据集由Fisher在1936年整理,包含4个特征(Sepal.Length(花萼长度)、Sepal.Width(花萼宽度)、Petal.Length(花瓣长度)、Petal.Width(花瓣宽度)),特征值都为正浮点数,单位为厘米。目标值为鸢尾花的分类(Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),Iris Virginica(维吉尼亚鸢尾))。导入IRIS数据集的代码如下:&#13;
1 from sklearn.datasets import load_iris&#13;
3 #导入IRIS数据集&#13;
4 iris = load_iris()&#13;
6 #特征矩阵&#13;
7 iris.data&#13;
9 #目标向量&#13;
10 iris.target&#13;
2 数据预处理&#13;
  通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题:&#13;
不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。&#13;
信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。&#13;
定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。:假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。&#13;
存在缺失值:缺失值需要补充。&#13;
信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。&#13;
  我们使用sklearn中的preproccessing库来进行数据预处理,可以覆盖以上问题的解决方案。&#13;
2.1 无量纲化&#13;
  无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。&#13;
2.1.1 标准化&#13;
  标准化需要计算特征的均值和标准差,公式表达为:&#13;
  使用preproccessing库的StandardScaler类对数据进行标准化的代码如下:&#13;
1 from sklearn.preprocessing import StandardScaler&#13;
3 #标准化,返回值为标准化后的数据&#13;
4 StandardScaler().fit_transform(iris.data)&#13;
2.1.2 区间缩放法&#13;
  区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,公式表达为:&#13;
  使用preproccessing库的MinMaxScaler类对数据进行区间缩放的代码如下:&#13;
1 from sklearn.preprocessing import MinMaxScaler&#13;
3 #区间缩放,返回值为缩放到[0, 1]区间的数据&#13;
4 MinMaxScaler().fit_transform(iris.data)&#13;
2.1.3 无量纲化与正则化的区别&#13;
  简单来说,无量纲化是依照特征矩阵的列处理数据,正则化是依照特征矩阵的行处理数据。正则化的前提是样本各特征值服从正态分布,正则化后将其转换成标准正态分布。正则化的公式类似于标准化,不同的是样本均值和样本标准差改为特征值均值和特征值标准差。&#13;
  使用preproccessing库的Normalizer类对数据进行正则化的代码如下:&#13;
1 from sklearn.preprocessing import Normalizer&#13;
3 #正则化,返回值为正则化后的数据&#13;
4 Normalizer().fit_transform(iris.data)&#13;
2.2 对定量特征二值化&#13;
  定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0,公式表达如下:&#13;
  使用preproccessing库的Binarizer类对数据进行二值化的代码如下:&#13;
1 from sklearn.preprocessing import Binarizer&#13;
3 #二值化,阈值设置为3,返回值为二值化后的数据&#13;
4 Binarizer(threshold=3).fit_transform(iris.data)&#13;
2.3 对定性特征哑编码&#13;
  由于IRIS数据集的特征皆为定量特征,故使用其目标值进行哑编码(实际上是不需要的)。使用preproccessing库的OneHotEncoder类对数据进行哑编码的代码如下:&#13;
1 from sklearn.preprocessing import OneHotEncoder&#13;
3 #哑编码,对IRIS数据集的目标值,返回值为哑编码后的数据&#13;
4 OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))&#13;
2.4 缺失值计算&#13;
  由于IRIS数据集没有缺失值,故对数据集新增一个样本,4个特征均赋值为NaN,表示数据缺失。使用preproccessing库的Imputer类对数据进行缺失值计算的代码如下:&#13;
1 from numpy import vstack, array, nan&#13;
2 from sklearn.preprocessing import Imputer&#13;
4 #缺失值计算,返回值为计算缺失值后的数据&#13;
5 #参数missing_value为缺失值的表示形式,默认为NaN&#13;
6 #参数strategy为缺失值填充方式,默认为mean(均值)&#13;
7 Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))&#13;
2.5 数据变换&#13;
  常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的。4个特征,度为2的多项式转换公式如下:&#13;
  使用preproccessing库的PolynomialFeatures类对数据进行多项式转换的代码如下:&#13;
1 from sklearn.preprocessing import PolynomialFeatures&#13;
3 #多项式转换&#13;
4 #参数degree为度,默认值为2&#13;
5 PolynomialFeatures().fit_transform(iris.data)&#13;
  基于单变元函数的数据变换可以使用一个统一的方式完成,使用preproccessing库的FunctionTransformer对数据进行对数函数转换的代码如下:&#13;
1 from numpy import log1p&#13;
2 from sklearn.preprocessing import FunctionTransformer&#13;
4 #自定义转换函数为对数函数的数据变换&#13;
5 #第一个参数是单变元函数&#13;
6 FunctionTransformer(log1p).fit_transform(iris.data)&#13;
2.6 回顾&#13;
StandardScaler&#13;
无量纲化&#13;
标准化,基于特征矩阵的列,将特征值转换至服从标准正态分布&#13;
MinMaxScaler&#13;
无量纲化&#13;
区间缩放,基于最大最小值,将特征值转换到[0, 1]区间上&#13;
Normalizer&#13;
正则化&#13;
基于特征矩阵的行,将特征值转换至服从标准正态分布&#13;
Binarizer&#13;
二值化&#13;
基于给定阈值,将定量特征按阈值划分&#13;
OneHotEncoder&#13;
哑编码&#13;
将定性数据编码为定量数据&#13;
Imputer&#13;
缺失值计算&#13;
计算缺失值,缺失值可填充为均值等&#13;
PolynomialFeatures&#13;
多项式数据转换&#13;
多项式数据转换&#13;
FunctionTransformer&#13;
自定义单元数据转换&#13;
使用单变元的函数来转换数据&#13;
3 特征选择&#13;
  当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:&#13;
特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。&#13;
特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。&#13;
  根据特征选择的形式又可以将特征选择方法分为3种:&#13;
Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。&#13;
Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。&#13;
Embedded:集成法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。&#13;
  我们使用sklearn中的feature_selection库来进行特征选择。&#13;
3.1 Filter&#13;
3.1.1 方差选择法&#13;
  使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:&#13;
1 from sklearn.feature_selection import VarianceThreshold&#13;
3 #方差选择法,返回值为特征选择后的数据&#13;
4 #参数threshold为方差的阈值&#13;
5 VarianceThreshold(threshold=3).fit_transform(iris.data)&#13;
3.1.2 相关系数法&#13;
  使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的SelectKBest类结合相关系数来选择特征的代码如下:&#13;
1 from sklearn.feature_selection import SelectKBest&#13;
2 from scipy.stats import pearsonr&#13;
4 #选择K个最好的特征,返回选择特征后的数据&#13;
5 #第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数&#13;
6 #参数k为选择的特征个数&#13;
7 SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)&#13;
3.1.3 卡方检验&#13;
  经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:&#13;
  。用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:&#13;
1 from sklearn.feature_selection import SelectKBest&#13;
2 from sklearn.feature_selection import chi2&#13;
4 #选择K个最好的特征,返回选择特征后的数据&#13;
5 SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)&#13;
3.1.4 互信息法&#13;
  经典的互信息也是评价定性自变量对定性因变量的相关性的,互信息计算公式如下:&#13;
  为了处理定量数据,最大信息系数法被提出,使用feature_selection库的SelectKBest类结合最大信息系数法来选择特征的代码如下:&#13;
1 from sklearn.feature_selection import SelectKBest&#13;
2 from minepy import MINE&#13;
4 #由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5&#13;
5 def mic(x, y):&#13;
m = MINE()&#13;
m.compute_score(x, y)&#13;
return (m.mic(), 0.5)&#13;
10 #选择K个最好的特征,返回特征选择后的数据&#13;
11 SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)&#13;
3.2 Wrapper&#13;
3.2.1 递归特征消除法&#13;
  递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:&#13;
1 from sklearn.feature_selection import RFE&#13;
2 from sklearn.linear_model import LogisticRegression&#13;
4 #递归特征消除法,返回特征选择后的数据&#13;
5 #参数estimator为基模型&#13;
6 #参数n_features_to_select为选择的特征个数&#13;
7 RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)&#13;
3.3 Embedded&#13;
3.3.1 基于惩罚项的特征选择法&#13;
  使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:&#13;
1 from sklearn.feature_selection import SelectFromModel&#13;
2 from sklearn.linear_model import LogisticRegression&#13;
4 #带L1惩罚项的逻辑回归作为基模型的特征选择&#13;
5 SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)&#13;
  ,所以没选到的特征不代表不重要。故,可结合L2惩罚项来优化。具体操作为:若一个特征在L1中的权值为1,选择在L2中权值差别不大且在L1中权值为0的特征构成同类集合,将这一集合中的特征平分L1中的权值,故需要构建一个新的逻辑回归模型:&#13;
1 from sklearn.linear_model import LogisticRegression&#13;
3 class LR(LogisticRegression):&#13;
def __init__(self, threshold=0.01, dual=False, tol=1e-4, C=1.0,&#13;
fit_intercept=True, intercept_scaling=1, class_weight=None,&#13;
random_state=None, solver=&liblinear&, max_iter=100,&#13;
multi_class=&ovr&, verbose=0, warm_start=False, n_jobs=1):&#13;
#权值相近的阈值&#13;
self.threshold = threshold&#13;
self.penalty = &l1&&#13;
self.dual = dual&#13;
self.tol = tol&#13;
self.C = C&#13;
self.fit_intercept = fit_intercept&#13;
self.intercept_scaling = intercept_scaling&#13;
self.class_weight = class_weight&#13;
self.random_state = random_state&#13;
self.solver = solver&#13;
self.max_iter = max_iter&#13;
self.multi_class = multi_class&#13;
self.verbose = verbose&#13;
self.warm_start = warm_start&#13;
self.n_jobs = n_jobs&#13;
#使用同样的参数创建L2逻辑回归&#13;
self.l2 = LogisticRegression(penalty=&l2&, dual=dual, tol=tol, C=C, fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight = class_weight, random_state=random_state, solver=solver, max_iter=max_iter, multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs)&#13;
def fit(self, X, y, sample_weight=None):&#13;
#训练L1逻辑回归&#13;
super(LR, self).fit(X, y, sample_weight=sample_weight)&#13;
self.coef_old_ = self.coef_.copy()&#13;
#训练L2逻辑回归&#13;
self.l2.fit(X, y, sample_weight=sample_weight)&#13;
cntOfRow, cntOfCol = self.coef_.shape&#13;
#权值系数矩阵的行数对应目标值的种类数目&#13;
for i in range(cntOfRow):&#13;
for j in range(cntOfCol):&#13;
coef = self.coef_[i][j]&#13;
#L1逻辑回归的权值系数不为0&#13;
if coef != 0:&#13;
idx = [j]&#13;
#对应在L2逻辑回归中的权值系数&#13;
coef1 = self.l2.coef_[i][j]&#13;
for k in range(cntOfCol):&#13;
coef2 = self.l2.coef_[i][k]&#13;
#在L2逻辑回归中,权值系数之差小于设定的阈值,且在L1中对应的权值为0&#13;
if abs(coef1-coef2) & self.threshold and j != k and self.coef_[i][k] == 0:&#13;
idx.append(k)&#13;
#计算这一类特征的权值系数均值&#13;
mean = coef / len(idx)&#13;
self.coef_[i][idx] = mean&#13;
return self&#13;
View Code&#13;
  使用feature_selection库的SelectFromModel类结合带L1以及L2惩罚项的逻辑回归模型,来选择特征的代码如下:&#13;
1 from sklearn.feature_selection import SelectFromModel&#13;
3 #带L1和L2惩罚项的逻辑回归作为基模型的特征选择&#13;
4 #参数threshold为权值系数之差的阈值&#13;
5 SelectFromModel(LR(threshold=0.5, C=0.1)).fit_transform(iris.data, iris.target)&#13;
3.3.2 基于树模型的特征选择法&#13;
  树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:&#13;
1 from sklearn.feature_selection import SelectFromModel&#13;
2 from sklearn.ensemble import GradientBoostingClassifier&#13;
4 #GBDT作为基模型的特征选择&#13;
5 SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)&#13;
3.4 回顾&#13;
所属方式&#13;
VarianceThreshold&#13;
Filter&#13;
方差选择法&#13;
SelectKBest&#13;
Filter&#13;
可选关联系数、卡方校验、最大信息系数作为得分计算的方法&#13;
Wrapper&#13;
递归地训练基模型,将权值系数较小的特征从特征集合中消除&#13;
SelectFromModel&#13;
Embedded&#13;
训练基模型,选择权值系数较高的特征&#13;
4 降维&#13;
  当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。&#13;
4.1 主成分分析法(PCA)&#13;
  使用decomposition库的PCA类选择特征的代码如下:&#13;
1 from sklearn.decomposition import PCA&#13;
3 #主成分分析法,返回降维后的数据&#13;
4 #参数n_components为主成分数目&#13;
5 PCA(n_components=2).fit_transform(iris.data)&#13;
4.2 线性判别分析法(LDA)&#13;
  使用lda库的LDA类选择特征的代码如下:&#13;
1 from sklearn.lda import LDA&#13;
3 #线性判别分析法,返回降维后的数据&#13;
4 #参数n_components为降维后的维数&#13;
5 LDA(n_components=2).fit_transform(iris.data, iris.target)&#13;
4.3 回顾&#13;
decomposition&#13;
主成分分析法&#13;
线性判别分析法&#13;
5 总结&#13;
  再让我们回归一下本文开始的特征工程的思维导图,我们可以使用sklearn完成几乎所有特征处理的工作,而且不管是数据预处理,还是特征选择,抑或降维,它们都是通过某个类的方法fit_transform完成的,fit_transform要不只带一个参数:特征矩阵,要不带两个参数:特征矩阵加目标向量。这些难道都是巧合吗?还是故意设计成这样?方法fit_transform中有fit这一单词,它和训练模型的fit方法有关联吗?接下来,我将在《使用sklearn高效地进行数据挖掘》中阐述其中的奥妙!&#13;
6 参考资料&#13;
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信

我要回帖

 

随机推荐