Python深入浅出总结~

一、概要

1.有监督学习:通过现有训练数据集进行建模,再用模型对新的数据样本进行分类或者回归分析的机器学习方法。

2.无监督学习(非监督式学习):则是在没有训练数据集的情况下,对没有标签的数据进行分析并建立合适的模型,以便给出问题解决方案的方法。

分类和回归是有监督学习中两个常见的方法。

3.分类:机器学习的目标是对样本的类标签进行预测,判断样本属于哪一个分类,结果是离散的数值。

4.回归:其目标是要预测一个连续的数值或范围。

5.模型的泛化:在有监督学习中,我们会在训练数据集上建立一个模型,之后把这个模型用于新的,从未见过的数据中,这个过程称为模型的泛化。

6.过拟合:如果我们在训练数据集上使用了一个非常复杂的模型,以至于这个模型在拟合训练数据集时表现非常好,但是在测试数据集时的表现非常差,说明模型出现了过拟合的问题。

7.欠拟合:如果模型过于简单,连训练数据集的特点都不能完全考虑到的话,那么这样的模型在训练数据集和测试数据集的得分都会非常差,则说明模型出现了欠拟合的问题。

二、Python所用库的介绍

1.Numpy——基础科学计算库:是一个python中非常基础的用于进行科学计算的库,它的功能包括高维数组计算、线性代数计算、傅里叶变换以及生成伪随机数等。

2.Scipy——强大科学计算工具集:是一个python中用于进行科学计算的工具集,它有很多功能,如计算统计学分布、信号处理、计算线性代数方程等。

3.pands——数据分析的利器:是一个python中用于进行数据分析的库,它可以生成类似Excel表格式的数据表,而且可以对数据表进行修改操作。它可以从很多不同种类的数据库中提取数据,如SQL数据库、Excel表格甚至SCV文件。pandas还支持在不同的列中使用不同类型的数据,如整数型、浮点数、字符串。

4.matplotib——画出优美的图形:是一个python的绘图库,它以各种硬拷贝格式和跨平台的交互环境生成出版质量级别的图形,它能够输出的图形包括折线图、散点图、直方图等。

5.scikit-learn——非常流行的python机器学习库:建立在Scipy基础上的用于机器学习的Python模块,它包含众多顶级机器学习算法,主要有六大类的基本功能,分别是分类、回归、聚类、数据降维、模型选择和数据预处理。(它拥有活跃的用户社区,里面有各种详尽的文档供用户参考,可以通过阅读用户指南以及文档,来对其算法的使用有更充分了解。

三、K最近邻算法——近朱者赤,近墨者黑

K最近邻算法是一个非常经典而且原理十分容易理解的算法,可用分类和回归,但是K最近邻算法在实际使用中会有很多问题,列如它需要对数据集认真地进行预处理、对规模超大的数据集拟合的时间较长、对高位数据集拟合欠佳、以及对稀松数据集束手无策等。
所以在当前的各种应用场景中,K最近邻算法的使用并不多见。

四、广义线性模型——“耿直”的算法模型

线性模型是使用输入数据集的特征的线性函数进行建模,并对结果进行预测的方法。
常用的线性模型包括;线性回归、岭回归、套索回归、逻辑回归和线性SVC等。

五、朴素贝叶斯——打雷啦,收衣服啦

朴素贝叶斯算法是一种基于贝叶斯理论的有监督学习算法。该算法不用考虑样本特征之间的关系,认为样本特征之间是互相独立的,因而朴素贝叶斯分类器的效率是非常更高的。在scikit-learn中包含三种算法:贝努利朴素贝叶斯、高斯贝叶斯、多项式朴素贝叶斯。

六、决策树与随机森林——会玩读心术的算法

决策树:优点是可以将模型进行可视化(使用graphviz库),几乎不需要对数据进行预处理。缺点是容易出现过拟合的问题。
随机森林:是一种集合学习算法,弥补了决策树的过拟合问题,也不要求对数据进行预处理,支持并行处理。缺点是对于超高维数据集、稀疏数据集等来说,线性模型要比随机森林的表现更好一些。随机森林相对更消耗内存,速度也比线性模型要慢。
这两种算法都可以对高维数据集进行降维处理——可帮助用户在数据集中对数据特征的重要性进行判断。

七、支持向量机SVM——专治线性不可分

SVM算法的核函数功能:将数据投射至高维空间。
使用的方法是多项式内核(Polynomial kernel)和径向基内核(RBF)也被称为高斯内核。
优势:对高维数据集和低维数据集都可以。但是前提是数据集的规模不太大,如果数据集中的样本数量在1W以内,都是OK的。但如果数据集超过10W的话,就会非常损耗时间和内存。
缺点:对于数据集预处理和参数调节要求非常高。

八、神经网络——曾入冷宫,如今得宠

这里介绍的主要是“多层感知器”,即MLP算法,也被称为前馈神经网络,或者被泛称为神经网络。在Scikit-learn中的MLP分类和回归在易用性方面表现确实不错,但是仅限于小数据集。对于更庞大或更复杂的数据集来说,就显得有点力不从心了。

神经网络可以从超大数据集中获取信息并且可以建立极为复杂的模型,所以在表现能力充足并且参数设置合适的情况下,神经网络可以比其他机器学习算法表现更加优异。但是它的问题也很突出,如模型训练的时间相对较长、对数据预处理的要求较高等。

对于特征类型比较单一的数据来说,神经网络的表现不错;但如果数据集中的特征类型差异比较大的话,随机森林或是梯度上升随机决策树等基于决策树的算法会表现更好。

建议参考原则:神经网络中隐藏层的节点数约等于训练数据集的特征数量,但是一般不要超过500。在开始训练模型的时候,可以让模型尽量复杂,然后在对正则化参数alpha进行调节来提高模型的表现。

九、数据预处理、降维、特征提取及聚类——快刀斩乱麻

数据预处理:使用StandardScaler

使用scikit-learn的preprocessing模块对数据集进行预处理。
StandardScaler采用均值和方差进行转换。
#导入StandarScaler
from sklearn.preprocessing import StandardScaler
#使用StandarScaler进行数据预处理
X_1 = StandarScaler().fit_transform(X)

数据预处理:使用MinMaxScaler

MinMaxScaler将所有数据的特征值都转换到0到1之间,可以想象成MinMaxScaler是将所有的数据压近一个长和宽都是1的方格子当中,这样会让模型训练的速度更快并且准确率也会提高。
#导入MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
#使用StandarScaler进行数据预处理
X_2 = MinMaxScaler().fit_transform(X)

数据预处理:使用RobustScaler

RobustScaler采用中位数和四分位数。
#导入RobustScaler
from sklearn.preprocessing import RobustScaler
#使用RobustScaler进行数据预处理
X_3 = RobustScaler().fit_transform(X)

数据预处理:使用Normalizer

Normalizer是将所有样本的特征向量转化为欧几里得距离为1,也就是说它把数据的分布变成一个半径为1的圆或者是一个球。
Normalizer通常是在我们只想要保留数据集向量的方向,而忽略其数值的时候用。
#导入Normalizer
from sklearn.preprocessing importNormalizer
#使用Normalizer进行数据预处理
X_4 = Normalizer().fit_transform(X)

数据降维

采用PCA主成分分析方法,属于无监督学习算法。——使用scikit-learn

特征提取

1、使用PCA主成分分析法
2、使用非负矩阵分解NMF,属于无监督学习算法。——使用scikit-learn

聚类算法

1、K均值聚类算法
2、凝聚聚类算法
3、DBSCAN算法
——使用scikit-learn

十、数据表达与特征工程——锦上再添花

数据表达

1.使用哑变量转化类型特征

哑变量也称为虚拟变量,是一种在统计学和经济学领域非常常用的,用来把某些类型变量转化为二值变量的方法。——使用pandas

2.对数据进行装箱处理

装箱处理(binning)也称为离散化处理(discretization)——使用numpy

数据“升维”

在实际应用中,常常会遇到数据集的特征不足的情况,要解决这个问题,就需要对数据集的特征进行扩充。

1.向数据集添加交互式特征

交互式特征是在原始数据集特征中添加交互式,使特征数量增加。可采用Numpy中的hstack函数来对数据集添加交互项。

2.向数据集添加多项式特征

多项式指的是多个单项式相加所组成的代数式,使用scikit-learn中内置的功能,称为PolynomiaFeatures,使用这个功能可以轻松地将原始数据集的特征进行扩展。

自动特征选择

在复杂的特征中,有一些对于模型预测结果的影响比较大,而有一些重要性相对较低,此时可采用scikit-learn进行自动特征选择。

1.使用单一变量法进行特征选择

可使用scikit-leanr中的最简单的两种方法:SelectPercentile和SeletKBest

2.基于模型的特征选择

基于模型的特征选择工作原理是,先使用一个有监督学习的模型对数据特征的重要性进行判断,然后把最重要的特征进行保留。当然,这一步中用到的模型和最终用来进行预测分析的模型不一定是同一个。
采用scikit-leanr中的SelectFromModel功能

3.迭代式特征选择

迭代式特征选择是基于若干个模型进行特征选择。在scikit-leanr中,有一个称为递归特征剔除法(PFE)。

十一、模型评估与优化——只有更好,没有最好

使用交叉验证进行模型评估

在scikit-leanr中默认采用的是K折叠交叉验证法(k-fold cross validation),还有其他的方法:“随机拆分交叉验证法”(shuffle-split cross validation)和"挨个儿试试"(leave-one-out)

#导入交叉验证工具
from sklearn.model_selection import cross_val_score

#导入随机差分工具
from sklearn.model_selection import ShuffleSplit

#导入挨个儿试试工具
from sklearn.model_selection import LeaveOneOut

使用网格搜索优化模型参数

简单网格搜索

相当于对模型中的参数一用for i in [参数1,参数2,参数3…]进行遍历,中间可以进行堆叠参数二依旧用for i in [参数1,参数2,参数3…]进行遍历。

与交叉验证结合的网格搜索

第一种:手动操作,先进行网格搜索,之后使用交叉验证,在里面采用if语句进行判定模型分数值(将大的分数值重复赋值,依旧判断即可),最终输出最大分数和最优的参数。

第二种:在scikit-learn中内置了一个类,称为GridSearchCV,可直接使用这个类进行交叉验证与网格搜索。
#导入网格搜索工具
from sklearn.model_selection import GridSearchCV
#将需要遍历的参数定义为字典
params = {‘alpha’:[0.01,0.1,1.0,10.0],‘max_iter’:[100,1000,5000,10000]}
#定义网格搜索中使用的模型和参数
grid_search = GridSearchCV(lasso,params,cv=6)
#使用网格搜索拟合数据
grid_sarch.fit(X_tarin,Y_train)
#打印结果
模型最高分 grid_search.score(X_test,Y_test)
最优参数 grid_search.best_params_

分类模型的可信度评估

在scikit-learn中,有很多模型都有predict_proba功能,这个功能就是用于计算模型在对数据集进行分类时,每个样本属于不同分类的可能性是多少。
还可采用另一种方式来检查分类的可信度,那就是决定系数decision_funtion。

十二、建立算法的管道模型——团结就是力量

在机器学习中,我们把一系列算法打包在一起,让他们各司其职,形成一个流水线,这就是我们所说的管道模型——更为严谨的叫法:在scikit-leanr中的类(class)

使用管道模型进行模型选择和参数优化。

在sklearn中可以使用make_pipline模块来便捷地建立管道模型,或者采用Pipeline建立管道模型。

十三、文本数据处理——亲,见字如“数”

文本数据的特征提取、中文分词及词袋模型

1、使用CountVectorizer对文本进行特征提取

单独使用它的话只能进行英文单词的提取,实现的是单词分词的统计,但它无法对中文进行提取判断。
#导入向量化工具CountVectorizer工具
from sklearn.feature_extraction.text import CountVerctorizer

2、中文分词采用jieba库

将jieba库与上面提到的CountVectorizer相结合,即可实现中文的分词统计。

3、使用词袋模型将文本数据转换为数组

在上面中CountVectorizer会给每个词编码为一个从0到N的整型数,之后我们便可采用稀疏矩阵对这个文本数据进行处理了。
词袋模型采用的是CountVectorizer.transform(放jieba的分词)

上面所采用的方法虽然能够实现分词的统计,用词袋模型可以简化自然语言,利于机器学习算法建模,但是它的劣势也很明显——由于词袋模型把句子看做单词的简单集合,那么单词出现的顺序就会被无视,这样一来可能会导致包含同样单词,但是顺序不一样的两句话在机器看来成了完全一样的意思。

对文本数据进一步进行优化

1、使用n-Gram改善词袋模型

通过修改CountVectorizer(ngram_range=(2,2))中的ngram参数,当参数取2时表示对相邻的两个单词进行匹配,当参数取3时,会对相邻的3个单词进行配对。

2、使用tf-idf模型对文本数据进行处理

tf-idf全称为term frequency-inverse document frequency,一般翻译为词频-逆向文件频率。
在scikit-learn中,有两个类提供了tf-idf方法,一个是TfidTransformer,它是用来将CountVectorizer从文本中提取的特征矩阵进行转换;另一个是TfidVectorizer,它和CountVectorizer的用法是相同的——简单理解的话,它相当于把CountVectorizer和TfidTransformer所做的工作整合在了一起。

3、删除文本中的停用词

在自然语言处理领域,有一个概念称为停用词(Stopwords),指的是那些在文本处理过程中被筛除出去的,出现频率很高但有没有什么实际的词,如各种语气词、连词、介词等。

目前没有一个通用的停用词规则或工具,但常见的方法是:统计文本数据中出现频率过高的词然后将它们作为停用词去掉,或者是使用现有的停用词表。
可在网上搜索 哈工大停用词词库 or 百度停用词表等资源进行更加深入的了解。

在scikit-learn中,内置了英文的停用词表,其中包含常见的停用词381个。
#导入内置的停用词库
from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS
#激活英语停用词表
tfidf = TfidfVectorizer(smooth_idf=False, stop_words=‘english’)
对于中文停用词表,我们可以下载网上的中文停用词表,并在scikit-learn中自己定义一个停用词的字典,来实现去掉中文文本停用词的目的。

十四、从数据获取到话题提取——从“研究员”到“段子手”

1、简单页面爬取

可采用Requests库,在使用之前应当先搞清楚我们的User agent (用户代理) ,避免有些网站会对用户的 User agent 进行校检,如果没有的话,就会被服务器拒之门外了。

User agent 最简单的获取办法是在百度搜索 UA 查询,复制浏览器的User agent 即可。

2、稍微复杂一点的爬取

可采用Requests库,python自带的re库,BeautifulSoup库。
re库为正则表达式库,它能帮助你方便的检查一个字符串是否与某种模式匹配。也就是说可以用来提取文本中的数字或中文。
使用BeautifulSoup进行HTML解析,可以从HTML文件或者XML文件中提取各种类型的数据。在使用时若用了lxml解析的话,则需要安装lxml库。

3、对文本数据进行话题提取

在爬取了文本内容之后,可采用潜在狄利克雷分布(LDA)进行话题提取,它是基于不同的词语共同出现的频率来进行分组的模型。机器所理解的话题,并非语义上所指的话题,而只是通过对文本进行特征提取后所进行的聚类。
使用方法:可先采用jieba库进行分词,接着用CountVectorizer或者是TfidfVectorizer将文本转换为向量,接着用LDA模型进行话题提取。
#导入LDA模型
from sklearn.decomposition import LatentDirichletAllocation

若要进行更加复杂的爬取,推荐学习Scrapy库,这是目前最常用的用于开发爬虫的工具之一。

你可能感兴趣的:(Python,机器学习)