提升sklearn 上 SVM classifier 的如何提升电脑运行速度度有什么好途径

学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参数无法从数据中估计,只能靠人的经验进行指定,后一类参数就叫超参数
比如,支持向量机里的C,Kernel,gama,朴素贝叶斯里的alpha等,在学习其模型的设计中,我们要搜索超参数空间为学习器模型找到最合理的超参数,可以通过以下方法获得学习器模型的参数列表和当前取值:estimator.get_params()
sklearn 提供了两种通用的参数优化方法:网络搜索和随机采样,
网格搜索交叉验证(GridSearchCV):以穷举的方式遍历所有可能的参数组合
随机采样交叉验证(RandomizedSearchCV):依据某种分布对参数空间采样,随机的得到一些候选参数组合方案
sklearn.model_selection:GridSearchCV,RandomizedSearchCV,ParameterGrid,ParameterSampler,fit_grid_point
①GridSearchCV:
该方法提供了在参数网格上穷举候选参数组合的方法。参数网格由参数param_grid来指定,比如,下面展示了设置网格参数param_grid的一个例子:
param_grid=[
  {'C':[1,10,100,1000],'kernel':['linear']},
  {'C':[1,10,100,1000],'gamma':[0.001,0.0001],'kernel':['rbf']}
上面的参数指定了要搜索的两个网格(每个网格就是一个字典):第一个里面有4个参数组合节点,第二个里面有4*2=8个参数组合节点
GridSearchCV的实例实现了通用的estimator API:当在数据集上训练的时候,所有可能的参数组合将会被评估,训练完成后选组最优的参数组合对应的estimator。
from sklearn import svm,datasets
from sklearn.model_selection import GridSearchCV
iris=datasets.load_iris()
parameters={'kernel':('rbf','linear'),'C':[1,5,10]}
svr=svm.SVC()
clf=GridSearchCV(svr,parameters)
clf.fit(iris.data,iris.target)
print(clf.best_estimator_)
最终结果:
SVC(C=1, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='linear',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
②RandomizedSearchCV
RandomizedSearchCV类实现了在参数空间上进行随机搜索的机制,其中参数的取值是从某种概率分布中抽取的,这个概率分布描述了对应的参数的所有取值情况的可能性,这种随机采样机制与网格穷举搜索相比,有两大优点:
相比于整体参数空间,可以选择相对较少的参数组合数量
添加参数节点不影响性能,不会降低效率
指定参数的采样范围和分布可以用一个字典开完成,跟网格搜索很像,另外,计算预算(总共要采样多少参数组合或者迭代做多少次)可以用参数n_iter来指定,针对每一个参数,既可以使用可能取值范围内的概率分布,也可以指定一个离散的取值列表(离散的列表将被均匀采样)
{'C':scpiy.stats.expon(scale=100),'gamma':scipy.stats.expon(scale=.1),'kernel':['rbf'],'class_weight':['balanced':None]}
上边的例子中:C服从指数分布,gamma服从指数分布,这个例子使用了scipy.stats模块,其中包含了很多有用的分布用来产生参数采样点,像expon,gamma,uniform or randint,原则上,任何函数都可以传递进去,只要他提供一个rvs(random variate sample)方法来返回采样值,rvs函数的连续调用应该能够保证产生独立同分布的样本值。
import numpy as np
from time import time
from scipy.stats import randint as sp_randint
from sklearn.model_selection import RandomizedSearchCV
from sklearn.datasets import load_digits
from sklearn.ensemble import RandomForestClassifier
def report(results,n_top=3):
for i in range(1,n_top+1):
candidates=np.flatnonzero(results['rank_test_score']==i)
for candidate in candidates:
print("Model with rank:{0}".format(i))
print("Mean validation score:{0:.3f}(std:{1:.3f})".format(
results['mean_test_score'][candidate],
results['std_test_score'][candidate]))
print("Parameters:{0}".format(results['params'][candidate]))
digis=load_digits()
X,y=digis.data,digis.target
clf=RandomForestClassifier(n_estimators=20)
#设置想要优化的超参数以及他们的取值分布
param_dist={"max_depth":[3,None],
"max_features":sp_randint(1,11),
"min_samples_split":sp_randint(2,11),
"min_samples_leaf":sp_randint(1,11),
"bootstrap":[True,False],
"criterion":['gini','entropy']
#开启超参数空间的随机搜索
n_iter_search=20
random_search=RandomizedSearchCV(clf,param_distributions=param_dist,n_iter=n_iter_search)
start=time()
random_search.fit(X,y)
print("RandomizedSearchCV took %.3f seconds for %d candidates"
"parameter settings."%((time()-start),n_iter_search))
report(random_search.cv_results_)
最终结果:
RandomizedSearchCV took 3.652 seconds for 20 candidatesparameter settings.
Model with rank:1
Mean validation score:0.930(std:0.019)
Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'entropy', 'max_features': 8, 'bootstrap': False, 'min_samples_split': 10}
Model with rank:2
Mean validation score:0.928(std:0.009)
Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'gini', 'max_features': 4, 'bootstrap': False, 'min_samples_split': 10}
Model with rank:3
Mean validation score:0.924(std:0.009)
Parameters:{'max_depth': None, 'min_samples_leaf': 1, 'criterion': 'gini', 'max_features': 9, 'bootstrap': True, 'min_samples_split': 5}
③超参数优化中的随机搜索和网格搜索对比试验以随机森林分类器为优化对象。所有影响分类器学习的参数都被搜索了,除了树的数量之外,随机搜索和网格优化都在同一个超参数空间上对随机森林分类器进行优化,虽然得到的超参数设置组合比较相似,但是随机搜索的运行时间却比网络搜索显著的少,随机搜索得到的超参数组合的性能稍微差一点,但这很大程度上由噪声引起的,在实践中,我们只能挑几个比较重要的参数组合来进行优化。
import numpy as np
from time import time
from scipy.stats import randint as sp_randint
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_digits
from sklearn.ensemble import RandomForestClassifier
def report(results,n_top=3):
for i in range(1,n_top+1):
candidates=np.flatnonzero(results['rank_test_score']==i)
for candidate in candidates:
print("Model with rank:{0}".format(i))
print("Mean validation score:{0:.3f}(std:{1:.3f})".format(
results['mean_test_score'][candidate],
results['std_test_score'][candidate]))
print("Parameters:{0}".format(results['params'][candidate]))
digis=load_digits()
X,y=digis.data,digis.target
clf=RandomForestClassifier(n_estimators=20)
print("==========下面是RandomizedSearchCV的测试结果===============")
#设置想要优化的超参数以及他们的取值分布
param_dist={"max_depth":[3,None],
"max_features":sp_randint(1,11),
"min_samples_split":sp_randint(2,11),
"min_samples_leaf":sp_randint(1,11),
"bootstrap":[True,False],
"criterion":['gini','entropy']
#开启超参数空间的随机搜索
n_iter_search=20
random_search=RandomizedSearchCV(clf,param_distributions=param_dist,n_iter=n_iter_search)
start=time()
random_search.fit(X,y)
print("RandomizedSearchCV took %.3f seconds for %d candidates"
"parameter settings."%((time()-start),n_iter_search))
report(random_search.cv_results_)
print("==========下面是GridSearchCV的测试结果===============")
#在所有参数上搜索,找遍所有网络节点
param_grid={"max_depth":[3,None],
"max_features":[1,3,10],
"min_samples_split":[2,3,10],
"min_samples_leaf":[1,3,10],
"bootstrap":[True,False],
"criterion":['gini','entropy']
#开启超参数空间的网格搜索
grid_search=GridSearchCV(clf,param_grid=param_grid)
start=time()
grid_search.fit(X,y)
print("GridSearchCV took %.2f seconds for %d candidates parameter settings."
%(time()-start,len(grid_search.cv_results_['params'])))
report(random_search.cv_results_)
最终结果:
==========下面是RandomizedSearchCV的测试结果===============
RandomizedSearchCV took 3.874 seconds for 20 candidatesparameter settings.
Model with rank:1
Mean validation score:0.928(std:0.010)
Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'entropy', 'max_features': 10, 'bootstrap': False, 'min_samples_split': 2}
Model with rank:2
Mean validation score:0.920(std:0.007)
Parameters:{'max_depth': None, 'min_samples_leaf': 4, 'criterion': 'gini', 'max_features': 6, 'bootstrap': False, 'min_samples_split': 2}
Model with rank:2
Mean validation score:0.920(std:0.009)
Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'entropy', 'max_features': 7, 'bootstrap': True, 'min_samples_split': 10}
==========下面是GridSearchCV的测试结果===============
GridSearchCV took 37.64 seconds for 216 candidates parameter settings.
Model with rank:1
Mean validation score:0.928(std:0.010)
Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'entropy', 'max_features': 10, 'bootstrap': False, 'min_samples_split': 2}
Model with rank:2
Mean validation score:0.920(std:0.007)
Parameters:{'max_depth': None, 'min_samples_leaf': 4, 'criterion': 'gini', 'max_features': 6, 'bootstrap': False, 'min_samples_split': 2}
Model with rank:2
Mean validation score:0.920(std:0.009)
Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'entropy', 'max_features': 7, 'bootstrap': True, 'min_samples_split': 10}
超参数空间的搜索技巧
技巧一,指定一个合适的目标测度对模型进行估计
    默认情况下,参数搜索使用estimator的score函数来评估模型在某种参数配置下的性能:
      分类器对应于 sklearn.metrics.accuracy_score
      回归器对应于sklearn.metrics.r2_score
  但是在某些应用中,其他的评分函数获取更加的合适。(比如在非平衡的分类问题中,准确率sccuracy_score通常不管用。这时,可以通过参数scoring来指定GridSearchCV类或者RandomizedSearchCV类内  部用我们自定义的评分函数)
技巧二、使用SKlearn的PipeLine将estimators和他们的参数空间组合起来
技巧三、合理划分数据集:开发集(用于GridSearchCV)+测试集(Test)使用model_selection.train_test_split()函数来搞定!
技巧四、并行化:(GridSearchCV)和(RandomizedSearchCV)在参数节点的计算上可以做到并行计算,这个通过参数”n_jobs“来指定。
技巧五、提高在某些参数节点上发生错误时的鲁棒性:在出错节点上只是提示警告。可以通过设置参数error_score=0(or=np.NaN)来搞定!
阅读(...) 评论()sklearn学习——SVM例程总结1(outlier and unbalanced classes)
写在前面的话
最近两周一直在看SVM,有人称它为数学届的奇迹,推导过程极其重要,其中蕴含的思想和技巧是极其深刻和巧妙的,对学习者而言,过程的推导的意义甚至超过了应用层面。这里推荐几本书:李航的《统计学习方法》,周志华的《机器学习》,《Pattern Recognition and Machine Learning》书中详细介绍了推导过程。这里不做推导过程和原理的叙述,只从sklearn例程说起。
先来个简单的:
例程1:利用线性和非线性核做回归
import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
svr_lin = SVR(kernel='linear', C=1e3)
svr_poly = SVR(kernel='poly', C=1e3, degree=2)
y_rbf = svr_rbf.fit(X, y).predict(X)
y_lin = svr_lin.fit(X, y).predict(X)
y_poly = svr_poly.fit(X, y).predict(X)
来个复杂一点的,但是库没增加
例2:NonlinearSVM
# plot the decision function for each datapoint on the #grid
Z = clf.decision_function(np.c_[xx.ravel(), \yy.ravel()])#用于计算每个网格点到分离超平面的距离
Z = Z.reshape(xx.shape)#写成xx矩阵大小的形式。
plt.imshow(Z, interpolation='nearest',extent=(xx.min(),'''
xx.max(), yy.min(), yy.max()),aspect='auto',origin='lower', cmap=plt.cm.PuOr_r)#plt.imshow用于画二维彩色图像,Z的大小对应着颜#色的改变,cmap=plt.cm.PuOr_r用于表示颜色,这里具体参数值含义还不是##很理解,可以调调程序感受一下就行了。
contours = plt.contour(xx, yy, Z, levels=[0], linewidths=2,linetypes='--')#contour用于在网格上画等高线,levels=[0],表示等高线的值。
#以上复杂是在画图上,可视化确实是一个很大的学问!
再来个复杂点的
例3:Separating hyperplane for unbalanced classes
[不平衡数据集的分类问题]
首先,什么是不平衡数据集?
网络样本、金融样本以及生物样本中,观测样本具有涌现性,大量的样本中有用的样本点很少。这种某类样本的数量明显少于其他类样本数量的样本集称为不均衡样本集
其次,为什么 会有不平衡数据问题?
传统的学习方法以降低总体分类精度为目标,将所有样本一视同仁,同等对待,造成了分类器在多数类的分类精度较高而在少数类的分类精度很低。机器学习模型都有一个待优化的损失函数,以我们最常用最简单的二元分类器逻辑回归为例,其损失函数如下公式1所示,逻辑回归以优化总体的精度为目标,不同类别的误分类情况产生的误差是相同的,考虑一个500:1500:1的数据集,即使把所有样本都预测为多数类其精度也能达到500/之高,很显然这并不是一个很好的学习效果,因此传统的学习算法在不平衡数据集中具有较大的局限性。
最后,不平衡数据集的特点以及如何处理?
有时对少数类错分情况的后果很严重,比如癌症患者被误诊为健康人。所以需要的分类器应该是在不严重损失多数类精度的情况下,在少数类上获得尽可能高的精度
同时也暗示着使用单一的评价准则,例如全局精度或是误差率,是不能给不均衡问题提供足够的评价信息。因此利用含有更多信息的评价指标,例如接收机特性曲线、精度-recall曲线和代价曲线。
不平衡数据的分类问题是一个很现实的问题,很重要,已经有了几种解决方法。
具体可以参看:
[该昵称已经被占用]的博客
[qq_]的博客
[Xubao’s Blog]的博客
[从实际经验中选择合适的方法]
[综述论文Learning from Imbalanced Data]
本例从算法层面,利用加权法,也就是说,允许正负样本的函数间隔边界不同,C+/C-越大,对该类型误分类惩罚增大(也就是训练学习的越好)。本例中将1类数据惩罚系数为10,即C+=10,代码为class_weight={1:10}或者class_weight=‘auto’ 或者class_weight={0:0.1}
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-5, 5)
yy = a * xx - clf.intercept_[0] / w[1]
wclf = svm.SVC(kernel='linear', class_weight={1: 10})
wclf.fit(X, y)
例4,[Weighted samples]
这里用sample_weight方法解决outlier问题,目的和class_weight一样,都是对不同样本点选取不同的惩罚系数,达到自适应学习的目的。
sample_weight_last_ten = abs(np.random.randn(len(X)))
sample_weight_constant = np.ones(len(X))
# and bigger weights to some outliers
#偏离正常位置很远的数据点,我们称之为 outlier
#例如可能并不是因为数据本身是非线性结构的,而只是因为数据有噪音。对于这#种偏离正常位置很远的数据点,我们称之为 outlier ,在我们原来的 SVM ##模型里,outlier 的存在有可能造成很大的影响,因为超平面本身就是只有##少数几个 support vector 组成的,如果这些 support vector 里又存#在 outlier 的话,其影响就很大了。
sample_weight_last_ten[15:] *= 5#[15,16,17,18,19,20]*5
sample_weight_last_ten[9] *= 15
# for reference, first fit without class weights
# fit the model
clf_weights = svm.SVC()
clf_weights.fit(X, y, sample_weight=sample_weight_last_ten)
clf_no_weights = svm.SVC()
clf_no_weights.fit(X, y)
这里提醒一下,现实中大部分数据是存在outlier and unbalanced classes,这种情况下,尽管多数类大部分预测对了,计算出的正确率很高,但少数类预测错了大部分,其正确率却很低。这种情况是很危险的,比如癌症预测,很容易检测不出癌症患者。因此,传统的正确率计算不适应这类分类问题。比较好的评价模型性能指标是AUC。
可以参考如下文章:
说到现在,其实以上例程都是
用于入门的,不过我也花了三天时间才能复现每一个程序。现在每天都忙于课题,之前还是关于机器学习的内容,后期,课题的需要又在整 机器人刚-柔耦合建模,信号处理,智能控制等等,除此之外,还要出差,老师给的一系列活儿,事情太多。不过,心在此,兴趣在此,相信未来也在此,继续加油,更深入的理解机器学习和其他算法知识,相信和我一样情况的人很多,比我情况更糟的人也有,他们能坚持下来,我也能。想想,一个人这一辈子如果不能坚持去做一件事情也是挺可悲的。坚定的做自己喜欢的事,乐此不疲,继续前行!
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?sklearn学习笔记 - CSDN博客
sklearn学习笔记
转自https://ynuwm.github.io//sklearn学习笔记/#more
scikit-learn基础介绍
估计器(Estimator)
估计器,很多时候可以直接理解成分类器,主要包含两个函数:
●fit():训练算法,设置内部参数。接收训练集和类别两个参数。
●predict():预测测试集类别,参数为测试集。
大多数scikit-learn估计器接收和输出的数据格式均为numpy数组或类似格式。
转换器(Transformer)
转换器用于数据预处理和数据转换,主要是三个方法:
●fit():训练算法,设置内部参数。
●transform():数据转换。
●fit_transform():合并fit和transform两个方法。
流水线(Pipeline)
sklearn.pipeline包
流水线的功能:
●跟踪记录各步骤的操作(以方便地重现实验结果)
●对各步骤进行一个封装
●确保代码的复杂程度不至于超出掌控范围
基本使用方法
流水线的输入为一连串的数据挖掘步骤,其中最后一步必须是估计器,前几步是转换器。输入的数据集经过转换器的处理后,输出的结果作为下一步的输入。最后,用位于流水线最后一步的估计器对数据进行分类。
每一步都用元组( ‘名称’,步骤)来表示。现在来创建流水线。
scaling_pipeline = Pipeline([
('scale', MinMaxScaler()),
('predict', KNeighborsClassifier())])
主要在sklearn.preprcessing包下。
●MinMaxScaler :最大最小值规范化
●Normalizer :使每条数据各特征值的和为1
●StandardScaler :为使各特征的均值为0,方差为1
●LabelEncoder :把字符串类型的数据转化为整型
●OneHotEncoder :特征用一个二进制数字来表示
●Binarizer :为将数值型特征的二值化
●MultiLabelBinarizer:多标签二值化
包:sklearn.feature_extraction
特征抽取是数据挖掘任务最为重要的一个环节,一般而言,它对最终结果的影响要高过数据挖掘算法本身。只有先把现实用特征表示出来,才能借助数据挖掘的力量找到问题的答案。特征选择的另一个优点在于:降低真实世界的复杂度,模型比现实更容易操纵。
一般最常使用的特征抽取技术都是高度针对具体领域的,对于特定的领域,如图像处理,在过去一段时间已经开发了各种特征抽取的技术,但这些技术在其他领域的应用却非常有限。
●DictVectorizer: 将dict类型的list数据,转换成numpy array
●FeatureHasher : 特征哈希,相当于一种降维技巧
●image:图像相关的特征抽取
●text: 文本相关的特征抽取
●text.CountVectorizer:将文本转换为每个词出现的个数的向量
●text.TfidfVectorizer:将文本转换为tfidf值的向量
●text.HashingVectorizer:文本的特征哈希
CountVectorize只数出现个数
TfidfVectorizer:个数+归一化(不包括idf)
TF-IDF(Term Frequency-Inverse Document Frequency,词频和逆向文件频率)对每个单词做进一步考量。
TF(词频)的计算很简单,就是针对一个文件t,某个单词Nt 出现在该文档中的频率。比如文档“I love this movie”,单词“love”的TF为1/4。如果去掉停用词“I”和”it“,则为1/2。
IDF(逆向文件频率)的意义是,对于某个单词t,凡是出现了该单词的文档数Dt,占了全部测试文档D的比例,再求自然对数。
比如单词“movie“一共出现了5次,而文档总数为12,因此IDF为ln(5/12)。
很显然,IDF是为了凸显那种出现的少,但是占有强烈感情色彩的词语。比如“movie”这样的词的IDF=ln(12/5)=0.88,远小于“love”的IDF=ln(12/1)=2.48。
TF-IDF就是把二者简单的乘在一起即可。这样,求出每个文档中,每个单词的TF-IDF,就是我们提取得到的文本特征值。
sklearn.feature_extraction.DictVectorizer类基于One-Hot Encoding 一位热编码提取分类特征;
sklearn.feature_extraction.text.CountVectorizer类基于词库模型将文字转换成特征向量;
sklearn.feature_extraction.text.TfidfVectorizer类可以统计TF-IDF词频;
12345678910111213141516
# DictVectorizer()将dict类型的list数据转化成numpy array# fit():训练算法,设置内部参数# transform():数据转换# fit_transform():合并fit和transform两个方法from sklearn.feature_extraction import DictVectorizeronehot_encoder = DictVectorizer()instances = [{'city': 'New York'},{'city': 'Los Angeles'}, {'city': 'San Antonio'}]print(onehot_encoder.fit_transform(instances).toarray())'''otu:[[ 0.
12345678910111213141516171819
# CountVectorizer类通过正则表达式用空格分割句子,然后抽取长度大于等于2的字母序列from sklearn.feature_extraction.text import CountVectorizercorpus = [
'Today the weather is sunny',
'Sunny day weather is suitable to exercise ',
'I ate a Hotdog'
vectorizer = CountVectorizer()
print (vectorizer.fit_transform(corpus).todense())
print (vectorizer.vocabulary_)
'''out:[[0 0 0 0 1 0 1 1 0 1 1] [0 1 1 0 1 1 1 0 1 0 1] [1 0 0 1 0 0 0 0 0 0 0]]{u'ate': 0, u'is': 4, u'sunny': 6, u'to': 8, u'weather': 10, u'today': 9, u'the': 7, u'suitable': 5, u'day': 1, u'exercise': 2, u'hotdog': 3}'''
1234567891011121314
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
'The dog ate a sandwich and I ate a sandwich',
'The wizard transfigured a sandwich'
vectorizer = TfidfVectorizer(stop_words='english')
print(vectorizer.fit_transform(corpus).todense())
print(vectorizer.vocabulary_)
0..6316672
0.6316672 ]]
{'wizard': 4, 'transfigured': 3, 'ate': 0, 'dog': 1, 'sandwich': 2}
#通过TF-IDF加权之后,我们会发现在文集中较常见的词,如sandwich被调整了。
123456789101112131415161718192021222324252627
# -*- coding: utf-8 -*-
import scipy as sp
import numpy as np
from sklearn.datasets import load_files
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import
TfidfVectorizer
movie_reviews = load_files('data')
doc_terms_train, doc_terms_test, y_train, y_test = train_test_split(movie_reviews.data, movie_reviews.target, test_size = 0.3)
count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',stop_words = 'english')
x_train = count_vec.fit_transform(doc_terms_train)
= count_vec.transform(doc_terms_test)
= count_vec.transform(movie_reviews.data)
= movie_reviews.target
print(doc_terms_train)
print(count_vec.get_feature_names())
print(x_train.toarray())
print(movie_reviews.target) '''词频的计算使用的是sklearn的TfidfVectorizer。这个类继承于CountVectorizer,在后者基本的词频统计基础上增加了如TF-IDF之类的功能。我们会发现这里计算的结果跟我们之前计算不太一样。因为这里count_vec构造时默认传递了max_df=1,因此TF-IDF都做了规格化处理,以便将所有值约束在[0,1]之间。count_vec.fit_transform的结果是一个巨大的矩阵。可以看到上表中有大量的0,因此sklearn在内部实现上使用了稀疏矩阵。本例子数据较小。'''
data地址:
包:sklearn.feature_selection
特征选择的原因如下:
(1)降低复杂度
(2)降低噪音
(3)增加模型可读性
●VarianceThreshold: 删除特征值的方差达不到最低标准的特征
●SelectKBest: 返回k个最佳特征
●SelectPercentile: 返回表现最佳的前r%个特征
单个特征和某一类别之间相关性的计算方法有很多。最常用的有卡方检验(χ2)。其他方法还有互信息和信息熵。
●chi2: 卡方检验(χ2)
包:sklearn.decomposition
●主成分分析算法(Principal Component Analysis, PCA)的目的是找到能用较少信息描述数据集的特征组合。它意在发现彼此之间没有相关性、能够描述数据集的特征,确切说这些特征的方差跟整体方差没有多大差距,这样的特征也被称为主成分。这也就意味着,借助这种方法,就能通过更少的特征捕获到数据集的大部分信息。
包:sklearn.ensemble
组合技术即通过聚集多个分类器的预测来提高分类准确率。
常用的组合分类器方法:
(1)通过处理训练数据集。即通过某种抽样分布,对原始数据进行再抽样,得到多个训练集。常用的方法有装袋(bagging)和提升(boosting)。
(2)通过处理输入特征。即通过选择输入特征的子集形成每个训练集。适用于有大量冗余特征的数据集。随机森林(Random forest)就是一种处理输入特征的组合方法。
(3)通过处理类标号。适用于多分类的情况,将类标号随机划分成两个不相交的子集,再把问题变为二分类问题,重复构建多次模型,进行分类投票。
●BaggingClassifier: Bagging分类器组合
●BaggingRegressor: Bagging回归器组合
●AdaBoostClassifier: AdaBoost分类器组合
●AdaBoostRegressor: AdaBoost回归器组合
●GradientBoostingClassifier:GradientBoosting分类器组合
●GradientBoostingRegressor: GradientBoosting回归器组合
●ExtraTreeClassifier:ExtraTree分类器组合
●ExtraTreeRegressor: ExtraTree回归器组合
●RandomTreeClassifier:随机森林分类器组合
●RandomTreeRegressor: 随机森林回归器组合
AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),algorithm=&SAMME&,n_estimators=200)
装袋(bagging):根据均匀概率分布从数据集中重复抽样(有放回),每个自助样本集和原数据集一样大,每个自助样本集含有原数据集大约63%的数据。训练k个分类器,测试样本被指派到得票最高的类。
提升(boosting):通过给样本设置不同的权值,每轮迭代调整权值。不同的提升算法之间的差别,一般是(1)如何更新样本的权值,(2)如何组合每个分类器的预测。其中Adaboost中,样本权值是增加那些被错误分类的样本的权值,分类器C_i的重要性依赖于它的错误率。
Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成;Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。
模型评估(度量)
包:sklearn.metrics
sklearn.metrics包含评分方法、性能度量、成对度量和距离计算。
分类结果度量
参数大多是y_true和y_pred。
●accuracy_score:分类准确度
●condusion_matrix :分类混淆矩阵
●classification_report:分类报告
●precision_recall_fscore_support:计算精确度、召回率、f、支持率
●jaccard_similarity_score:计算jcaard相似度
●hamming_loss:计算汉明损失
●zero_one_loss:0-1损失
●hinge_loss:计算hinge损失
●log_loss:计算log损失
其中,F1是以每个类别为基础进行定义的,包括两个概念:准确率(precision)和召回率(recall)。准确率是指预测结果属于某一类的个体,实际属于该类的比例。召回率是被正确预测为某类的个体,与数据集中该类个体总数的比例。F1是准确率和召回率的调和平均数。
回归结果度量
●explained_varicance_score:可解释方差的回归评分函数
●mean_absolute_error:平均绝对误差
●mean_squared_error:平均平方误差
多标签的度量
●coverage_error:涵盖误差
●label_ranking_average_precision_score:计算基于排名的平均误差Label ●ranking average precision (LRAP)
聚类的度量
●adjusted_mutual_info_score:调整的互信息评分
●silhouette_score:所有样本的轮廓系数的平均值
●silhouette_sample:所有样本的轮廓系数
包:sklearn.cross_validation
●KFold:K-Fold交叉验证迭代器。接收元素个数、fold数、是否清洗
●LeaveOneOut:LeaveOneOut交叉验证迭代器
●LeavePOut:LeavePOut交叉验证迭代器
●LeaveOneLableOut:LeaveOneLableOut交叉验证迭代器
●LeavePLabelOut:LeavePLabelOut交叉验证迭代器
LeaveOneOut(n) 相当于 KFold(n, n_folds=n) 相当于LeavePOut(n, p=1)。LeaveP和LeaveOne差别在于leave的个数,也就是测试集的尺寸。LeavePLabel和LeaveOneLabel差别在于leave的Label的种类的个数LeavePLabel这种设计是针对可能存在第三方的Label,比如我们的数据是一些季度的数据。那么很自然的一个想法就是把1,2,3个季度的数据当做训练集,第4个季度的数据当做测试集。这个时候只要输入每个样本对应的季度Label,就可以实现这样的功能。
以下是实验代码,尽量自己多实验去理解。
123456789101112131415161718192021222324252627
#coding=utf-8import numpy as npimport sklearnfrom sklearnimport cross_validationX = np.array([[1, 2], [3, 4], [5, 6], [7, 8],[9, 10]])y = np.array([1, 2, 1, 2, 3])def show_cross_val(method):
if method == &lolo&:
labels = np.array([&summer&, &winter&, &summer&, &winter&, &spring&])
cv = cross_validation.LeaveOneLabelOut(labels)
elif method == 'lplo':
labels = np.array([&summer&, &winter&, &summer&, &winter&, &spring&])
cv = cross_validation.LeavePLabelOut(labels,p=2)
elif method == 'loo':
cv = cross_validation.LeaveOneOut(n=len(y))
elif method == 'lpo':
cv = cross_validation.LeavePOut(n=len(y),p=3)
for train_index, test_index in cv:
print(&TRAIN:&, train_index, &TEST:&, test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
print &X_train: &,X_train
print &y_train: &, y_train
print &X_test: &,X_test
print &y_test: &,y_testif __name__ == '__main__':
show_cross_val(&lpo&)
●train_test_split:分离训练集和测试集(不是K-Fold)
●cross_val_score:交叉验证评分,可以指认cv为上面的类的实例
●cross_val_predict:交叉验证的预测。
网格搜索
包:sklearn.grid_search
网格搜索最佳参数
●GridSearchCV:搜索指定参数网格中的最佳参数
●ParameterGrid:参数网格
●ParameterSampler:用给定分布生成参数的生成器
●RandomizedSearchCV:超参的随机搜索
通过bestestimator.get_params()方法,获取最佳参数。
多分类、多标签分类
包:sklearn.multiclass
●OneVsRestClassifier:1-rest多分类(多标签)策略
●OneVsOneClassifier:1-1多分类策略
●OutputCodeClassifier:1个类用一个二进制码表示
12345678910111213141516171819202122232425262728293031
#coding=utf-8from sklearn import metricsfrom sklearn import cross_validationfrom sklearn.svm import SVCfrom sklearn.multiclass import OneVsRestClassifierfrom sklearn.preprocessing import MultiLabelBinarizerimport numpy as npfrom numpy import randomX=np.arange(15).reshape(5,3)y=np.arange(5)Y_1 = np.arange(5)random.shuffle(Y_1)Y_2 = np.arange(5)random.shuffle(Y_2)Y = np.c_[Y_1,Y_2]def multiclassSVM():
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2,random_state=0)
model = OneVsRestClassifier(SVC())
model.fit(X_train, y_train)
predicted = model.predict(X_test)
print predicteddef multilabelSVM():
Y_enc = MultiLabelBinarizer().fit_transform(Y)
X_train, X_test, Y_train, Y_test = cross_validation.train_test_split(X, Y_enc, test_size=0.2, random_state=0)
model = OneVsRestClassifier(SVC())
model.fit(X_train, Y_train)
predicted = model.predict(X_test)
print predictedif __name__ == '__main__':
multiclassSVM()
# multilabelSVM()
上面的代码测试了svm在OneVsRestClassifier的包装下,分别处理多分类和多标签的情况。特别注意,在多标签的情况下,输入必须是二值化的。所以需要MultiLabelBinarizer()先处理。
朴素贝叶斯(Naive Bayes)
包:**sklearn.cross_validation
朴素贝叶斯的特点是分类速度快,分类效果不一定是最好的。
●GasussianNB:高斯分布的朴素贝叶斯
●MultinomialNB:多项式分布的朴素贝叶斯
●BernoulliNB:伯努利分布的朴素贝叶斯
所谓使用什么分布的朴素贝叶斯,就是假设P(x_i|y)是符合哪一种分布,比如可以假设其服从高斯分布,然后用最大似然法估计高斯分布的参数。
多项式分布
伯努利分布
scikit-learn扩展
具体的扩展,通常要继承sklearn.base包下的类。
●BaseEstimator: 估计器的基类
●ClassifierMixin :分类器的混合类
●ClusterMixin:聚类器的混合类
●RegressorMixin :回归器的混合类
●TransformerMixin :转换器的混合类
关于什么是Mixin(混合类),具体可以看这个。简单地理解,就是带有实现方法的接口,可以将其看做是组合模式的一种实现。举个例子,比如说常用的TfidfTransformer,继承了BaseEstimator,
TransformerMixin,因此它的基本功能就是单一职责的估计器和转换器的组合。
创建自己的转换器
在特征抽取的时候,经常会发现自己的一些数据预处理的方法,sklearn里可能没有实现,但若直接在数据上改,又容易将代码弄得混乱,难以重现实验。这个时候最好自己创建一个转换器,在后面将这个转换器放到pipeline里,统一管理。
例如《Python数据挖掘入门与实战》书中的例子,我们想接收一个numpy数组,根据其均值将其离散化,任何高于均值的特征值替换为1,小于或等于均值的替换为0。
代码实现:
12345678910111213141516
from sklearn.base import TransformerMixinfrom sklearn.utils import as_float_arrayclass MeanDiscrete(TransformerMixin):
#计算出数据集的均值,用内部变量保存该值。
def fit(self, X, y=None):
X = as_float_array(X)
self.mean = np.mean(X, axis=0)
#返回self,确保在转换器中能够进行链式调用(例如调用transformer.fit(X).transform(X))
return self
def transform(self, X):
X = as_float_array(X)
assert X.shape[1] == self.mean.shape[0]
return X & self.mean
如果文章对您有用请随意打赏,谢谢支持!
本文已收录于以下专栏:
相关文章推荐
学习器模型中一般有两种参数,一种参数是可以从学习中得到,还有一种无法靠数据里面得到,只能靠人的经验来设定,这类参数就叫做超参数。
优化超参数:
参数空间是由
1.一个回归器或者一个分类器
sklearn官方文档学习笔记
管道和特征联合:组合估计器Pipeline and FeatureUnion: combining estimators管道:链接估计器from sklearn....
模型验证方法
1.学习率曲线(learn_curve)
2.交叉验证得分(cross_val_score)
3.验证曲线(validation_curve)
一.学习率曲线
计算指定的学习器模型在不同...
SkLearn学习笔记
make_blobs聚类数据生成器简介
scikit中的make_blobs方法常被用来生成聚类算法的测试数据,直观地说,make_blobs会根据用户指定的特征数量、中心点数量、范围等来生...
决策树,特征选择的三个准则:信息增益(ID3),信息增益比(C4.5),基尼系数(CART)。决策树的生成,决策树的剪枝。
SVC、NuSVC、LinearSVC都可以在一个数据集上实现多分类。
SVC和NuSVC方法类似,但是有不同的输入参数集和不同的数学表述。另一方面,linearSVC是SVC的在线性核的基础上的另...
利用sklearn进行数据处理
前言:本文是学习笔记。sklearn介绍scikit-learn是数据挖掘与分析的简单而有效的工具。
依赖于NumPy, SciPy和matplotlib。它主要包含以下几部分内容:
从功能来分: ...
数据预处理 sklearn.preprocessing
标准化 (Standardization)
规范化(Normalization)
分类特征编码
推定缺失数据
生成多项式特征
定制转换器...
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 安卓提升运行速度 的文章

 

随机推荐