从sklearn说机器学习

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是怎么算的向量值。这里把它彻底说清楚。首先,列几个常见的困惑。

  1. TfidfVectorizer对所使用模型有没有限制?

不是的。TfidfVectorizer并不适用朴素贝叶斯算法。原因是sklearn只是把朴素贝叶斯用矩阵的形式进行计算,因此,在使用朴素贝叶斯时,可以说并不涉及文本的向量空间模型,在sklearn中需要用CountVectorizer将文本词语计数表示为矩阵的形式。而文本的VSM空间模型(词袋模型)主要是为了那些线性类算法而说的,因此CountVectorizer当然适用线性模型,TfidfVectorizer对词项用idf值进行改进,也就是考虑了词项在文档间的分布,也适用于线性模型,同时由于通常线性模型要求输入向量的模为1,因此TfidfVectorizer默认行向量是单位化后的。

  1. 训练集与测试集的比例会不会影响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的文本数有关。

  1. idf值是对词项权重的一种改进。

idf值对频次表示的文本向量进行了改进,它不仅考虑了文本中词项的频次,同时考虑了词项在一般文本上的出现频率,词项总是在一般的文本中出现,表示它可提供的分类信息较少,比如虚词 “的”、“地”、“得”等。

  1. 逆文档频率并没有考虑类词项在类别间的分布。

对得。idf值只是考虑了词项在所有文本间的分布特性,这里并不涉及类别,因此TfidfVectorizer的输入也不需要提供类别信息。

  1. TfidfVectorizer提供了基于频次的特征选择。

TfidfVectorizer在构建词汇表(特征词表)时考虑了词语文档频次,可以通过设置min_df和max_df来实现通过文档频次进行特征选择。

  1. 测试集包含一条文本和包好多条文本对于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&#
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值