SKlearn简介
scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包。它通过NumPy, SciPy和Matplotlib等python数值计算的库实现高效的算法应用,并且涵盖了几乎所有主流机器学习算法。
SKlearn官网:scikit-learn: machine learning in Python
在工程应用中,用python手写代码来从头实现一个算法的可能性非常低,这样不仅耗时耗力,还不一定能够写出构架清晰,稳定性强的模型。更多情况下,是分析采集到的数据,根据数据特征选择适合的算法,在工具包中调用算法,调整算法的参数,获取需要的信息,从而实现算法效率和效果之间的平衡。而sklearn,正是这样一个可以帮助我们高效实现算法应用的工具包。
sklearn有一个完整而丰富的官网,里面讲解了基于sklearn对所有算法的实现和简单应用。
常用模块
sklearn中常用的模块有分类、回归、聚类、降维、模型选择、预处理。
分类:识别某个对象属于哪个类别,常用的算法有:SVM(支持向量机)、nearest neighbors(最近邻)、 random forest(随机森林),常见的应用有:垃圾邮件识别、图像识别。
回归:预测与对象相关联的连续值属性,常见的算法有:SVR(支持向量机)、 ridge regression(岭回归)、Lasso,常见的应用有:药物反应,预测股价。
聚类:将相似对象自动分组,常用的算法有:k-Means、 spectral clustering、mean-shift,常见的应用有:客户细分,分组实验结果。
降维:减少要考虑的随机变量的数量,常见的算法有:PCA(主成分分析)、feature selection(特征选择)、non-negative matrix factorization(非负矩阵分解),常见的应用有:可视化,提高效率。
模型选择:比较,验证,选择参数和模型,常用的模块有:grid search(网格搜索)、cross validation(交叉验证)、 metrics(度量)。它的目标是通过参数调整提高精度。
预处理:特征提取和归一化,常用的模块有:preprocessing,feature extraction,常见的应用有:把输入数据(如文本)转换为机器学习算法可用的数据。
安装SKlearn
安装最新版本
Scikit-learn需要:
•Python(> = 2.7或> = 3.4),
•NumPy(> = 1.8.2),
•SciPy(> = 0.13.3)。
【注意】Scikit-learn 0.20是支持Python 2.7和Python 3.4的最后一个版本。Scikit-learn 0.21将需要Python 3.5或更高版本。
如果你已经安装了numpy和scipy,那么安装scikit-learn的最简单方法就是使用 pip或者canda
pip install -U scikit-learn
conda install scikit-learn
如果你尚未安装NumPy或SciPy,你也可以使用conda或pip安装它们。使用pip时,请确保使用binary wheels,并且不会从源头重新编译NumPy和SciPy,这可能在使用特定配置的操作系统和硬件(例如Raspberry Pi上的Linux)时发生。从源代码构建numpy和scipy可能很复杂(特别是在Windows上),需要仔细配置以确保它们与线性代数例程的优化实现相关联。为了方便,我们可以使用如下所述的第三方发行版本。
发行版本
如果你还没有numpy和scipy的python安装,我们建议你通过包管理器或通过python bundle安装。它们带有numpy,scipy,scikit-learn,matplotlib以及许多其他有用的科学和数据处理库。
可用选项包括:Canopy和Anaconda适用于所有支持的平台
除了用于Windows,Mac OSX和Linux的大量科学python库之外,Canopy和Anaconda都提供了最新版本的scikit-learn。
Anaconda提供scikit-learn作为其免费发行的一部分。
【注意】PIP和conda命令不要混用!!!
要升级或卸载scikit-learn安装了python或者conda你不应该使用PIP命令。
升级scikit-learn:conda update scikit-learn
卸载scikit-learn:conda remove scikit-learn
使用pip install -U scikit-learn安装或者使用pip uninstall scikit-learn卸载可能都没有办法更改有conda命令安装的sklearn。
算法选择
sklearn 实现了很多算法,面对这么多的算法,如何去选择呢?其实选择的主要考虑的就是需要解决的问题以及数据量的大小。sklearn官方提供了一个选择算法的引导图。
这里提供翻译好的中文版本,供大家参考:
sklearn-TfidfVectorizer彻底说清楚
在做文本分类之前,一定会涉及文本的向量化表示。sklearn提供的是传统的词袋模型,但是相信到现在为止也会有很多人不知道到底sklearn的TfidfVectorizer是怎么算的向量值。这里把它彻底说清楚。首先,列几个常见的困惑。
-
TfidfVectorizer对所使用模型有没有限制?
不是的。TfidfVectorizer并不适用朴素贝叶斯算法。原因是sklearn只是把朴素贝叶斯用矩阵的形式进行计算,因此,在使用朴素贝叶斯时,可以说并不涉及文本的向量空间模型,在sklearn中需要用CountVectorizer将文本词语计数表示为矩阵的形式。而文本的VSM空间模型(词袋模型)主要是为了那些线性类算法而说的,因此CountVectorizer当然适用线性模型,TfidfVectorizer对词项用idf值进行改进,也就是考虑了词项在文档间的分布,也适用于线性模型,同时由于通常线性模型要求输入向量的模为1,因此TfidfVectorizer默认行向量是单位化后的。
-
训练集与测试集的比例会不会影响tfidf值的计算?
会影响。但是影响的是词项的idf值计算,sklearn的TfidfVectorizer默认输入文本矩阵每行表示一篇文本,不同文本中相同词项的tf值不同,因此tf值与词项所在文本有关。而idf值与输入矩阵的行数(也就是训练集文本数)和包含词项的文本数有关,因此idf值与训练集的大小是有关系的。下边的式子是tf-idf计算式:
tf-idf(t,d)=tf(t,d)*idf(t)
idf(t)=
转存失败重新上传取消
平滑版 idf(t)=
转存失败重新上传取消
tf(t,d)是tf值,表示某一篇文本d中,词项t的频度,从式子可以看出tf值由词项和文本共同决定
idf(t)是词项t的idf值计算式,nd表示训练集文本数,df(d,t)表示包含词项t的文档总数,因此idf值与训练集文本总数和包含词项t的文本数有关。
-
idf值是对词项权重的一种改进。
idf值对频次表示的文本向量进行了改进,它不仅考虑了文本中词项的频次,同时考虑了词项在一般文本上的出现频率,词项总是在一般的文本中出现,表示它可提供的分类信息较少,比如虚词 “的”、“地”、“得”等。
-
逆文档频率并没有考虑类词项在类别间的分布。
对得。idf值只是考虑了词项在所有文本间的分布特性,这里并不涉及类别,因此TfidfVectorizer的输入也不需要提供类别信息。
-
TfidfVectorizer提供了基于频次的特征选择。
TfidfVectorizer在构建词汇表(特征词表)时考虑了词语文档频次,可以通过设置min_df和max_df来实现通过文档频次进行特征选择。
-
测试集包含一条文本和包好多条文本对于VSM向量值有影响?
没有影响。在TfidfVectorizer中通过fit_transform或fit来实现,词汇表建立,以及词汇表中词项的idf值计算,当然fit_transform更进一步将输入的训练集转换成了VSM矩阵形式。TfidfVectorizer的transform函数用于对测试文本进行向量化表示。表示的过程中用到训练得到的词汇表以及词项的idf值,而tf值由测试文本自身决定,因此一篇和多篇对于单篇文本向量表示没有影响。
上边问题有的是我不确定的,有的是看到有的群里边别人问的然后很多都是乱回答的。下边来看一下具体示例来验证一下
我们还是用我们的那个分类的示例语料
训练,构建词汇表以及idf值,这里同时生成训练集的VSM矩阵
# 导入TfidfVectorizer In [2]: from sklearn.feature_extraction.text import TfidfVectorizer # 实例化tf实例 In [3]: tv = TfidfVectorizer(use_idf=True, smooth_idf=True, norm=None) # 输入训练集矩阵,每行表示一个文本 In [4]: train = ["Chinese Beijing Chinese", ...: "Chinese Chinese Shanghai", ...: "Chinese Macao", ...: "Tokyo Japan Chinese"] ...: # 训练,构建词汇表以及词项idf值,并将输入文本列表转成VSM矩阵形式 In [6]: tv_fit = tv.fit_transform(train) # 查看一下构建的词汇表 In [10]: tv.get_feature_names() Out[10]: ['beijing', 'chinese', 'japan', 'macao', 'shanghai', 'tokyo'] # 查看输入文本列表的VSM矩阵 In [8]: tv_fit.toarray() Out[8]: array([[1.91629073, 2. , 0. , 0. , 0. , 0. ], [0. , 2. , 0. , 0. , 1.91629073, 0. ], [0. , 1. , 0. , 1.91629073, 0. , 0. ], [0. , 1. , 1.91629073, 0. , 0. , 1.91629073]])
手动计算一下第一篇文本的Beijing和Chinese两个词语的tf-idf值
# 词语beijing的在第1篇文本中的频次为.0,tf(beijing,d1)=1.0 # 词语beijing只在第1篇文本中出现过df(d,beijing)=1,nd=4, # 代入平滑版的tf-idf计算式得到1.9 In [13]: 1.0*(1+log((4+1)/(1+1))) Out[13]: 1.916290731874155 # 词语chinese的在第1篇文本中的频次为2.0,tf(chinese,d1)=2.0 # 词语chinese只在4篇文本中都出现过df(d,beijing)=4,nd=4, # 代入平滑版的tf-idf计算式得到2.0 In [14]: 2.0*(1+log(4/4)) Out[14]: 2.0
上边得到的矩阵就可以喂到后续的线性分类模型中进行训练了,注意要带每篇文本的类别标记呦。
下边看一下测试文本的表示
In [15]: test = ["Chinese Chinese Chinese Tokyo Japan"] In [16]: test_fit = tv.transform(test) In [19]: tv.get_feature_names() Out[19]: ['beijing', 'chinese', 'japan', 'macao', 'shanghai&#