机器学习快速入门(黑马程序员版)
1.机器学习概述
1.1-人工智能描述
1.1.1机器学习与人工智能、深度学习
三者关系:1.机器学习是人工智能的一个实现途径。2.深度学习是机器学习的一个方法发展而来。
人工智能的起点——达特茅斯会议
1956年8月,在美国汉诺斯小镇宁静的达特茅斯学院中,约翰麦卡锡、马文闵斯基(人工智能与认知学专家)、克劳德香农(信息论创始人)、艾伦纽厄尔(计算机科学家)、赫伯特西蒙(诺贝尔经济学得主)等人讨论用机器来模仿人类学习以及其他方面的智能。
1956年被称为人工智能元年。
1.1.2机器学习、深度学习能做些什么
机器学习的应用场景非常多,可以渗透到了各个行业领域当中。医疗、航空、教育、物流、电商等领域的各种应用场景。
用于挖掘、预测领域:店铺销量预测、量化投资、广告推荐、企业客户分类、SQL语句安全检测分类......
用在图像领域:街道交通标志检测、人脸识别等等
用在自然语言处理领域:文本分类、情感分析、自动聊天、文本检测等等
1.1.3人工智能阶段课程安排
1.2-什么是机器学习
1.2.1定义
机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测。
1.2.2解释
从数据(大量的猫和狗的图片)中自动分析获得模型(辨别猫和狗的规律),从而使机器拥有识别猫和狗的能力。
从数据(房屋的各种信息)中自动分析获得模型(判断房屋价格的规律),从而使机器拥有预测房屋价格的能力。
1.2.3数据集的构成
结构:特征值+目标值
1.每一行的数据称为样本。2.有些数据集可以没有目标值。
1.3-机器学习算法分类
特征值:猫/狗的图片;目标值:猫/狗-类别 离散型数据(分类问题)
特征值:房屋的各个属性信息;目标值:房屋价格-连续型数据 (回归问题)
特征值:人物的各个属性信息;目标值:无 (无监督学习)
1.3.1总结
1.3.2机器学习算法分类
监督学习(预测):输入数据使由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类)。
分类:k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归
回归:线性回归、岭回归
无监督学习:输入数据是由输入特征值所组成的。 聚类k-means
1.4-机器学习的开发流程
1.获取数据 2.数据处理 3.特征工程 4.机器学习算法训练-模型 5.模型评估 6.应用
1.5-学习框架和资料介绍
1.算法是核心,数据与计算是基础 2.找准定位
分析很多的数据;分析具体的业务;应用常见的算法;特征工程、调参数、优化。
具体做法:
学会分析问题,使用机器学习算法的目的,想要算法完成何种任务
掌握算法基本思想,学会对问题用相应的算法解决
学会利用库或者框架解决问题
1.5.1机器学习库与框架
1.5.2书籍资料
1.5.3提升内功
1.入门
2.实战类书籍
3.机器学习-“西瓜书”-周志华
统计学习方法-李航
深度学习-“花书”
2.特征工程
2.1-数据集
数据集分为训练集和测试集
2.1.1可用数据集
公司内部(百度)、数据接口(花钱)、数据集。
Kaggle网址:https:www.kaggle.com/datasets
UCI数据集网址:http://archive.ics.uci.edu/ml/
scikit-learn网址:http://scikit-learn.org/stable/datasets/index.html#datasets
1.Scikit-learn工具介绍
(1)Python语言的机器学习工具
(2)包括许多知名的机器学习算法的实现
(3)文档完善,容易上手,丰富的API
(4)目前稳定版本
2.安装
3.Scikit-learn包含的内容
监督学习(分类、回归)
无监督学习(聚类)
特征工程
模型选择
2.1.2sklearn数据集
1.scikit-learn数据集API介绍
sklearn.datasets 加载获取流行数据集
datasets.load_*() 获得小规模数据集,数据包含在datasets里
datasets.fetch_*(data_home=None) 获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是~/scikit_learn_data/
2.sklearn小数据集
sklearn.datasets.load_iris()
加载并返回鸢尾花数据集,包含类别、特征、样本数量、每个类别数量。
sklearn.datasets.load_boston()
加载并返回波士顿房价数据集,包含目标类别、特征、样本数量。
3.sklearn大数据集
sklearn.datasets.fetch_20newsgroups(data_home=None,subset='train')
subset:'train'或'test','all',可选择要加载的数据集
训练集的”训练“,测试集的”测试“,两者的”全部“
4.sklearn数据集的使用
以鸢尾花数据集为例
特征值4个——花瓣、花萼的长度、宽度
目标值3个——setosa,vericolor,virginica
sklearn数据集返回值介绍
load和fetch返回的数据类型datasets.base.Bunch(继承自字典格式)
data:特征数据数组,是[n_samples*n_features]的二维numpy.ndarray数组
target:标签数组,是n_samples的一维numpy.ndarray数组
DESCR:数据描述
feature_names:特征名,新闻数据,手写数字,回归数据集
targer_names:标签名
2.1.3数据集的划分
训练数据:用于训练,构建模型
测试数据:在模型检验时使用,用于评估模型是否有效
划分比例:
训练集:70% 80% 75%
测试集:30% 20% 30%
数据集划分apl
sklearn.model_selection.train_test_split(arrays,*options)
x数据集的特征值
y数据集的标签值
test_size测试集的大小,一般为float
random_state随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
return训练集特征值,测试集特征值,训练集目标值,测试集目标值
2.2-特征工程介绍
2.2.1为什么需要特征工程
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
2.2.2什么是特征工程
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
意义:会直接影响机器学习的效果
2.2.3特征工程的位置与数据处理的比较
pandas:一个数据读取非常方便以及基本的处理格式的工具。(数据清洗、数据处理)
sklearn:对于特征的处理提供了强大的接口。(特征工程)
特征工程包含的内容
特征抽取/特征提取,特征预处理,特征降维
2.3-特征抽取
机器学习算法-统计方法-数学公式
文本类型-数值
类型-数值
2.3.1特征提取
1.将任意数据(如文本或图像)转换为可用于机器学习的数字特征
字典特征提取(特征离散化)
文本特征提取
图像特征提取(深度学习将介绍)
2.特征提取API
sklearn.feature_extraction
2.3.2字典特征提取
作用:对字典数据进行特征值化,将类别转换成one-hot编码
sklearn.feature_extraction.DictVectorizer(sparse=True,...)
DictVectorizer.fit_transform(X):字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)X:array数组或者sparse矩阵返回值:转换之前数据格式
DictVectorizer.get_feature_names()返回类别名称
vector 数学:向量 物理:矢量
矩阵 matrix 二维数据
向量 vector 一维数组
父类:转换器类
返回sparse矩阵
sparse稀疏
将非零值按位置表示出来
节省内存-提高加载效率
1.应用
2.流程分析
实例化类DictVectorizer
调用fit_transform方法输入数据并转换(注意返回格式)
注意观察没有加上sparse=False参数的结果
所以加上参数之后,得到想要的结果:
之前在学习pandas中的离散化的时候,也实现了类似的效果。把这个处理数据的技巧叫做“one-hot"编码:
为每个类别生成一个布尔列。这些列中只有一列可以为每个样本取值1。因此,术语一个热编码,存在是1,不存在是0。
应用场景:
1.数据集中类别特征比较多(将数据集特征转换为字典类型,然后DictVectorizer转换)
2.本身拿到的数据就是字典类型,就用字典特征抽取
2.3.3文本特征提取
把单词作为特征 句子、短语、单词、字母
特征:特征词
作用:对文本数据进行特征值化
方法1:CountVectorizer 统计每个特征值出现的个数
sklearn.feature_extraction.text.CountVectorizer(stop_words=O) 返回词频矩阵
CountVectorizer.fit_transform(X)X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X)X:array数组或者sparse矩阵 返回值:转换之前数据格
CountVectorizer.get_feature_names() 返回值:单词列表
stop_words停用词表
关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章中出现的很少
1.应用
2.流程分析
实例化类CountVectorizer
调用fit_transform方法输入数据并转换(注意返回格式,利用toarray()进行spare矩阵转换array数组)
方法2:Tfidivectorizer文本特征提取
主要思想:如果某个词或词语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者词语具有很高的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
公式:
词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
逆向文件频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语的文件的数目,再将得到的商除以10为底的对数得到。
举例:语料库—1000篇文章 ”非常“—100篇文章 ”经济“—10篇文章
文章A(100词):10次”经济“ TF-IDF=0.2
tf:10/100=0.1
idf:lg1000/10=2
文章B(100词):10次”非常“ TF-IDF=0.1
tf:10/100=0.1
idf:lg1000/100=1
tfidf=tf×idf 最终得出的结果可以理解为重要程度
sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None,...) 返回词的权重矩阵
TfidfVectorizer.fit_transform(X)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵
TfidfVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前的数据格式
TfidfVectorizer.get_feature_names()
返回值:单词列表
重要性:分类机器学习算法进行文章分类中前期数据处理方式
2.4-特征预处理
2.4.1什么是特征预处理
通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程。
1.包含内容
数值型数据的无量纲化:归一化 标准化
2.特征预处理API
sklearn.preprocessing
进行归一化和标准化的原因:特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到它的特征。
需要用到一些方法进行无量纲化,使不同规格的数据转换到同一规格
2.4.2归一化
1.定义:通过对原始数据进行变换把数据映射到(默认为[0.1])之间
2.公式
3.API
sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)...)
MinMaxScalar.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
4.归一化总结:
最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
2.4.3标准化
1.定义:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
2.公式
对于归一化来说:如果出现异常点,影响了最值,那么结果显然会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小
3.API
sklearn.preprocessing.StandardScaler()
处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1
StandardScaler.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array(二维数组)
4.标准化总结:
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景
2.5-特征降维
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组”不相关“主变量的过程。
降低随机变量的个数
相关特征:相对湿度与降雨量之间的相关等等
维数:嵌套的层数
0维:标量
1维:向量
2维:矩阵
n维
2
2.5.2降维的两种方式
特征选择 主成分分析(可以理解一种特征提取的方式)
2.5.3什么是特征选择
1.定义:数据中包含冗余或相关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。
2.找出冗余特征的方法:
Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
方差选择法:低方差特征过滤
相关系数
Embedded(嵌入式):算法自动选择特征(特征与目标值之间的关联)
决策树:信息熵、信息增益
正则化:L1、L2
深度学习:卷积等
3.模块
sklearn.feature_selection
4.过滤式
4.1低方差特征过滤
删除低方差的一些特征,结合方差的大小来考虑这个方式的角度。
特征方差小:某个特征大多样本的值比较相近
特征方差大:某个特征很多样本的值都有差别
4.1.1API
sklearn.feature_selection.VarianceThreshold(thres=0.0)
删除所有低方差特征
Variance.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
4.2相关系数
皮尔逊相关系数(Pearson Correlation Coefficient)反映变量之间相关关系密切程度的统计指标
4.2.1公式计算案例
4.2.2特点
相关系数的值介于-1与+1之间,即-1≤r≤+1。其性质如下:
当r>0时,表示两变量正相关,r<0时,两变量为负相关
当|r|=1时,表示两变量为完全相关,当r=0时,表示两变量间无相关关系
当0<|r|<1时,表示两变量存在一定程度的相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱
一般可按三级划分:|r|<0.4为低度相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关
4.2.3API
from scipy.stats import pearsonr
x:(N,)array_like
y:(N,)array_like Returns:(Pearson's correlation coefficirnt,pvalue)
可以使用散点图来查看相关性
特征与特征之间相关性很高
1.选取其中一个作为代表
2.按一定权重进行加权求和形成一个新特征
3.主成分分析
2.6-主成分分析
2.6.1什么是主成分分析(PCA)
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息
应用:回归分析或者聚类分析当中
1.计算案例理解
假设给定五个点,(-1,-2)(-1,0)(0,0)(2,1)(0,1)
要求:将这个二维的数据简化成一维,并且损失少量的信息。
找到一个合适的直线,通过一个矩阵运算得出主成分分析的结果。
2.API
sklearn.decomposition.PCA(n_components=None)
将数据分解为较低维数空间
n_components:
小数:表示保留百分之多少的信息
整数:减少到多少特征
PCA.fit_transform(X)X:numpy array格式的数据
[n_samples,n_features]
返回值:转换后指定维度的array
2.6.2案例:探究用户对物品类别的喜好细分降维
1.需求
2.分析
1)需要将用户和物品类别放在同一个列表中 合并
2)找到二者之间的关系 交叉表和透视表
3)特征冗余过多 PCA降维
2.7-总结
3.分类算法
3.1 sklearn转换器和估计器
3.1.1转换器
之前做的特征工程的步骤
1.实例化(实例化的是一个转换器类(Transformer))
2.调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)
转换器:特征工程的接口
形式:fit_transform fit transform
区别:fit() 计算每一列的平均值、标准差
transform()(x-mean)/std进行最终的转换
3.1.2估计器(sklearn机器学习算法的实现)
1.用于分类的估计器:
sklearn.neighbors k-近邻算法
sklearn.naive_bayes 贝叶斯
sklearn.linear_model.LogisticRegression 逻辑回归
sklearn.tree 决策树
2.用于回归的估计器
sklearn.linear_model.LinearRegression 线性回归
sklearn,linear_model.Ridge 岭回归
3.用于无监督学习的估计器
sklearn.cluster.KMeans 聚类
估计器的工作流程
1.实例化一个estimator
2.estimator.fit(x_train,y_train)计算——调用完毕,模型生成
3.模型评估:1)直接比对真实值和预测值
y_predict=estimator.predict(x_test)
y_test==y_predict
2)计算准确率
accuracy=estimator.score(x_test,y_test)
3.2 K-近邻算法
3.2.1什么是K-近邻算法
1.K-近邻算法(KNN)原理
定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数术语某个类别,则该样本也属于这个类别。
距离公式(欧式距离): 若k=1则容易受到异常点的影响
2.电影类型分析
假设有几部电影
利用K-近邻算法思想
k=1 爱情片 k=2 爱情片 k=6 无法确定
k值取得过小,样本异常的影响,k值取得过大,样本不均衡的影响
3.2.2K-近邻算法API
3.2.3案例:鸢尾花种类预测
1.数据集介绍
iris数据集是常用的分类实验数据集,由Fisher,1936收集整理。iris也称鸢尾花卉数据集,是一类多重变量分析数据集。关于数据集的具体介绍:
2.步骤分析
1)获取数据
2)数据集划分
3)特征工程 标准化
4)KNN预估器流程
5)模型评估
3.结果分析
K值取很小:容易受到异常点的影响
K值取很大:受到样本均衡的问题
距离计算上面,时间复杂度高
3.2.4K-近邻总结
优点:简单、易于理解、易于实现、无需训练
缺点:懒惰算法,对测试样本分类时的计算量大,内存开销大,必须指定K值,K值选择不当则分类精度不能保证
使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试
3.3 模型选择与调优
3.3.1什么是交叉验证(cross validation)
交叉验证:将拿到的训练数据,分为训练集和验证集。以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证
1.分析
训练集:训练集+验证集
测试集:测试集
2.为什么需要交叉验证?
交叉验证的目的:为了让被评估的模型更加准确可信
3.3.2超参数搜索-网络搜索(Grid Search)
通常情况下,有很多参数是需要手动指定的(如K-近邻算法中的K值),这种叫超参数。但是手动过程复杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型
模型选择与调优API
sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=None)
对估计器的指定参数值进行详尽搜索
estimator:估计器对象
param_grid:估计器参数(dict){"n_neighbors":[1,3,5]}
cv:指定几折交叉验证
fit():输入训练数据
score():准确率
结果分析:
最佳参数:best_params_
最佳结果:best_score_
最佳估计器:best_estimator_
交叉验证结果:cv_results_
3.3.3案例:预测facebook签到位置
流程分析:获取数据、数据处理、特征工程:标准化、KNN算法预估流程、模型选择与调优、模型评估
1.数据集介绍
数据介绍:将根据用户的位置,准确性和时间戳预测用户正在查看的业务。
train.csv,test.csv
row_id:登记事件的ID
xy:坐标
准确性:定位准确性
时间:时间戳
place_id:业务的ID,这是预测的目标
2.步骤分析
对于数据做一些基本的处理:
1.缩小数据集范围DataFrame.query()
2.选取有用的时间特征 年月日时分秒
3.将签到位置少于n个用户的删除
分割数据集
标准化处理
K近邻预测
3.4 朴素贝叶斯算法
3.4.1什么是朴素贝叶斯算法
3.4.2概率基础
1.概率的定义
定义:一件事情发生的可能性
P(X)取值范围在[0,1]
2.女神是否喜欢计算案例
问题:
1.女神喜欢的概率
P(喜欢)=4/7
2.职业是程序员并且体型匀称的概率
P(程序员,匀称)=1/7
3.在女神喜欢的条件下,职业是程序员的概率
P(程序员|喜欢)=1/2
4.在女神喜欢的条件下,职业是程序员,体重是超重的概率
P(程序员,超重|喜欢)=1/4
3.4.3联合概率、条件概率与相互独立
联合概率:包含多个条件,且所有条件同时成立的概率 记作:P(A,B)
条件概率:就是事件A在另外一个事件B已经发生下的发生概率 记作:P(A|B)
相互独立:如果P(A,B)=P(A)P(B),则称事件A与事件B相互独立
3.4.4贝叶斯公式
朴素贝叶斯:假定特征与特征之间相互独立的贝叶斯公式,也就是说,朴素贝叶斯之所以朴素就在于假定了特征与特征相互独立
应用场景:文本分类(以单词作为特征)
3.文章分类计算
4.拉普拉斯平滑系数
目的:防止计算出的分类概率为0
3.4.5API
sklearn.naive_bayes.MultinomiaINB(alpha=1.0)
朴素贝叶斯分类
alpha:拉普拉斯平滑系数
3.4.6案例:20类新闻分类
1.步骤分析
1)获取数据
2)划分数据集 进行数据集的分割
3)特征工程 文本特征抽取(TFIDF进行的特征抽取,将文章字符串进行单词抽取)
4)朴素贝叶斯预估器流程
5)模型评估
3.4.7朴素贝叶斯算法总结
优点:朴素贝叶斯模型发源于古典数学理论,有稳定的分类效果。
对缺失数据不太敏感,算法也比较简单,常用于分本分类
分类准确度高,速度快
缺点:由于使用了样本属性独立性的假设,所以如果特征属性有关联时其效果不好
3.5 决策树
3.5.1认识决策树
if-else结构,最早的决策树是利用这类结构分割数据的一种分类学习方法。
如何高效的进行决策,特征的先后顺序
3.5.2决策树分类原理详解
已知:四个特征值 预测:是否贷款给某个人
先看房子,再看工作——是否贷款 只看了两个特征
先看年龄,再看信贷情况,最后看工作——看了三个特征
如何对这些客户进行分类预测?如何划分?
信息论基础
1)信息:消除随机不定性的东西
2)信息的衡量—信息量—信息熵
1.原理:信息熵、信息增益等
2.信息熵的定义
H的专业术语称之为信息熵,单位为比特。
3.决策树的划分依据之一——信息增益
定义与公式:特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为
g(D,A)=H(D)-t条件熵H(D|A)
ID3信息增益 最大的准则
C4.5信息增益比 最大的准则
CART 分类树:基尼系数 最小的准则 在sklearn中可以选择划分的默认原则
优势:划分更加细致(从后面例子的树来显示来理解)
3.5.3决策树API
class sklearn.tree.DecisionTreeClassifier(criterion='gini',
max_depth=None,random_state=None)
决策树分类器
criterion:默认是‘gini’系数,也可以选择信息增益的熵‘entropy'
max_depth:树的深度大小
random_state:随机数种子
3.5.4案例:泰坦尼克号乘客生存预测
分析步骤 特征值 目标值
1)获取数据
2)数据处理 缺失值处理 特征值-字典类型
3)准备特征值目标值
4)划分数据集
5)特征工程:字典特征抽取
6)决策树预估器流程
7)模型评估
3.5.5决策树可视化
1.保存树的结构到dot文件
sklearn.tree.export_graphviz()该函数能够导出DOT格式
tree.export_graphviz(estimator.out_file='tree.dot',feature_names=[","])
2.网站显示结构
http://webgraphviz.com/
点击 Generate Graph
3.5.6决策树总结
优点:简单的理解和解释,树木可视化
缺点:决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。
改进:减枝cart算法(决策树API当中已经实现,随机森林参数调优有相关介绍) 随机森林
3.6 集成学习方法之随机森林
3.6.1什么是集成学习方法
集成学习通过建立几个模型组合来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立的学习和做出预测。这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测。
3.6.2什么是随机森林
在机器学习中中,随机森林是包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
例如,如果训练了5个树,其中4个树的结果是True,1个树的结果是False,那么最终投票结果就是True
3.6.3随机森林原理过程
学习算法根据下列算法而建造每棵树:
用N来表示训练用例(样本)的个数。M表示特征数目。
1.一次随机选出一个样本,重复N次
2.随机去选出m个特征,m<<M,建立决策树
采取bootstrap抽样
训练集:N个样本
特征集 目标集 M个特征
两个随机——训练集随机 特征随机
训练集随机—N个样本中随机有放回的抽样N个
特征随机—从M个特征中随机抽取m个特征 M>>m(降维效果)
3.6.4API
3.6.5总结
在当前所有算法中,具有极好的准确率
能够有效地运行在大数据集上,处理具有高维特征的输入样本,而且不需要降维
能够评估各个特征在分类问题上的重要性
3.7总结
4.回归与聚类算法
4.1线性回归
回归问题:目标值 — 连续型的数据
4.1.1线性回归的原理
1.线性回归应用场景
房价预测
销售额度预测
金融:贷款额度预测、利用线性回归以及系数分析因子
2.什么是线性回归
1)定义与公式
线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方法。
特点:只有一个自变量的情况称为单变量回归,多于一个自变量情况的叫做多元回归
2)线性回归的特征与目标的关系分析
线性回归当中线性模型有两种,一种是线性关系,另一种是非线性关系。
单特征与目标值的关系呈直线关系,或者两个特征与目标值呈现平面关系
线性模型——自变量一次,参数一次
线性关系一定是线性模型,线性模型不一定是线性关系
4.1.2线性回归的损失和优化原理
目标:求模型参数
模型参数能够使得预测准确
损失函数/cost/成本函数/目标函数
1.损失函数
2.优化算法
目的是找到最小损失对应的W值
正规方程——直接求解W
拓展:1).y=ax^2+bx+c
y'=2ax+b=0
x=-b/2a
梯度下降
通过两个图来理解梯度下降
4.1.3线性回归API
通过正规方程优化
sklearn.linear_model.LinearRegression(fit_intercept=True)
fit_intercept:是否计算偏置
LinearRegression.coef_:回归函数
LinearRegression.intercept_:偏置
通过梯度下降优化
sklearn.linear_model.SGDRegressor(loss="squared_loss",fit_intercept=True,learning_rate='invscaling',eta0=0.01)
SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型。
loss:损失类型
loss="squared_loss":普通最小二乘法
fit_intercept:是否计算偏置
learning_rate:string,optional
学习率填充
'constant':eta=eta0
'optimal':eta=1.0/(alpha*(t+t0))[default]
'invscaling':eta=eta0/pow(t,power_t)
power_t=0.25:存在父类当中
对于一个常数值的学习率来说,可以使用learning_rate='constant',并使用eta0来指定学习率
SGDRegressor.coef_:回归系数
SGDRegressor.intercept_:偏置
4.1.4波士顿房价预测
数据介绍
流程
1)获取数据
2)划分数据集
3)特征工程:无量纲化-标准化
4)预估器流程 fit-模型 coef_intercept_
5)模型评估
1.分析
回归当中的数据大小不一致,是否会导致结果影响较大。所以需要做标准化处理。
数据分割与标准化处理
回归预测
线性回归的算法效果评估
2.回归性能评估
3.正规方程和梯度下降对比
4.1.5拓展-关于优化方法GD、SGD、SAG
1.GD
梯度下降(Gradient Descent),原始的梯度下降法需要计算所有样本的值才能够得出梯度,计算量大,所以后面才会有一系列的改进。
2.SGD
随机梯度下降(Stochastic gradient descent)是一个优化方法。它在一次迭代时只考虑一个训练样本。
SGD的优点是:高效,容易实现
SGD的缺点是:SGD需要许多超参数:比如正则项参数、迭代数。
SGD对于特征标准化是敏感的
3.SAG
随即平均梯度法(Stochasitc Average Gradient),由于收敛的速度太慢,有人提出SAG等基于梯度下降的算法
Scikit-learn:岭回归、逻辑回归等当中都会有SAG优化
4.2欠拟合与过拟合
4.2.1什么是过拟合与欠拟合
欠拟合
过拟合
分析:
第一种情况:因为机器学习到的天鹅特征太少了,导致区分标准太粗糙,不能准确识别出天鹅
第二种情况:机器已经基本能区别天鹅和其他动物了。然后,很不巧已有的天鹅图片全是白天鹅的,于是机器经过学习后,会认为天鹅的羽毛都是白色的,以后看到羽毛是黑的天鹅就会认为那不是天鹅。
定义:
过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合现象。(模型过于简单)
4.2.2原因以及解决办法
欠拟合原因以及解决办法
原因:学习到数据的特征过少
解决办法:增加数据的特征数量
过拟合原因以及解决办法
原因:原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点
解决办法:正则化
1.正则化类别
L2正则化(更常用)
作用:可以使得其中一些W的都很小,都接近于0,削弱某个特征的影响
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
Ridge回归——岭回归
加入L2正则化后的损失函数:
L1正则化
作用:可以使得其中一些W的值直接为0,删除这个特征的影响
LASSO回归
4.3线性回归的改进-岭回归
4.3.2带有L2正则化的线性回归——岭回归
岭回归,其实也是一种线性回归。只不过在算法建立回归方程时候,加上正则化的限制,从而达到解决过拟合的效果
1.API
sklearn.linear_model.Ridge(alpha=1.0,fit_intercept=True,solver="auto",normalize=False)
alpha:正则化力度,也叫λ,也叫惩罚项系数
λ取值:0~1 1~10
solver:会根据数据自动选择优化方法
sag:如果数据集、特征都比较大,选择该随机梯度下降优化
normalize:数据是否进行标准化
normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据
Ridge.coef_:回归权重
Ridge.intercept_:回归偏置
2.观察正则化程度的变化,对结果的影响?
正则化力度越大,权重系数会越小
正则化力度越小,权重系数会越大
4.4分类算法-逻辑回归与二分类
逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系。由于算法的简单和高效,在实际中应用非常广泛。
4.4.1逻辑回归的应用场景
广告点击率
是否为垃圾邮件
是否患病
金融诈骗
虚假账号
通过上边的例子,可以看出其中的特点,就是都属于两个类别之间的判断。逻辑回归就是解决二分类问题的利器。
4.4.2逻辑回归的原理
线性回归的输出就是逻辑回归的输入
回归的结果输入到sigmoid函数当中
输出结果:[0,1]区间中的一个概率值,默认0.5为阈值
3.损失以及优化
1 损失
逻辑回归的损失,称之为对数似然损失,公式如下:
分开类别:
利用log的函数图像来理解单个式子
y=1
y=0
综合完整的损失函数
2 优化损失
同样使用梯度下降优化算法,去减少损失函数的值,这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本是0类别的概率。
4.4.3逻辑回归API
sklearn.linear_model_LogisticRegression(solver='liblinear',penaity='12',C=1.0
solver:优化求解方式(默认开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数)
sag:根据数据集自动选择,随机平均梯度下降
penaity:正则化种类
C:正则化力度
4.4.4案例:癌症分类预测-良/恶性乳腺癌肿瘤预测
流程分析:
1)获取数据——读取的时候加上names
2)数据处理——处理缺失值
3)数据集划分
4)特征工程:无量纲化处理——标准化
5)逻辑回归预估器
6)模型评估
4.4.5分类的评估方法
1.精确率与召回率
1.混淆矩阵
在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
2.精确率和召回率(查得全不全)
精确率:预测结果为正例样本中真实为正的比例
召回率:真实为正例的样本中预测结果为正例的比例(查得全,对正样本的区分能力)
还有其他的评估标准,F1-score,反映了模型的稳健性
3.分类评估报告API
sklearn.metrics.classification_report(y_true,y_pred,labels=[],target_names=None)
y_true:真实目标值
y_pred:估计器预测目标值
labels:指定类别对应的数字
target_names:目标类别名称
return:每个类别精确率与召回率
问题:如何衡量样本不均衡下的评估?
2.ROC曲线与AUC指标
1知道TPR与FPR
TPR=TP/(TP+FN) 所有真实类别为1的样本中,预测类别为1的比例(召回率)
FPR=FP/(FP+TN) 所有真实类别为0的样本中,预测类别为1的比例
2ROC曲线
ROC曲线的横轴就是FPRate,纵轴是TPRate,当二者相等时,表示的意义则是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5.
3AUC指标
AUC的概率意义是随机取一对正负样本,正样本得AUC于负样本的概率
AUC的最小值为0.5,最大值为1,取值越高越好
AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测,绝大多数预测的场合,不存在完美分类器。
0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
最终AUC的范围在[0.5,1]之间,并且越接近1越好
4.AUC计算API
from sklearn.metrics import roc_auc_score
sklearn.metrics.roc_auc_score(y_ture,y_score)
计算ROC曲线面积,即AUC值
y_true:每个样本的真是类别,必须为0(反例),1(正例)标记
y_score:预测得分,可以是正类的估计概率、置信值或者分类器方法的返回值
5总结
AUC只能用来评价二分类
AUC非常适合评价样本不平衡的分类性能
4.5模型保存和加载
4.5.1sklearn模型的保存和加载API
from sklearn.externals import joblib
保存:joblib.dump(rf,'test.pkl)
加载:estimator=joblib.load('test.pkl)
4.5.2线性回归模型保存加载案例
4.6无监督学习-K-means算法
4.6.1什么是无监督学习
没有目标值——无监督学习
之所以称为无监督学习,是因为这是从无标签的数据开始学习的。
4.6.2无监督学习包含算法
聚类 K-means(K均值聚类)
降维 PCA
4.6.3K-means原理
K-means的聚类效果图
K-means聚类步骤
1、随即设置K个特征空间内的点作为初始的聚类中心
2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
4、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程
取K值:1.看需求 2.调节超参数(网格搜索)
4.6.4K-meansAPI
sklearn.cluster.KMeans(n_clusters=8,init='k-means++')
k-means聚类
n_clusters:开始的聚类中心数量
init:初始化方法,默认为‘k-means++'
labels_:默认标记的模型,可以和真实值比较(不是值比较)
4.6.5案例:K-means对Instacart Market用户聚类
1.分析
1.降维之后的数据
2.k-means聚类
3.聚类结果显示
4.6.6K-means性能评估指标
1.轮廓系数
2.轮廓系数值分析
“高内聚,低耦合”
分析过程(以一个蓝1点为例)
1、计算出蓝1离本身族群所有点的距离的平均值a_i
2、蓝1到其它两个族群的距离计算出平均值红平均,绿平均,取最小的那个距离作为b_i
根据公式:极端值考虑:如果b_i>>a_i:那么公式的结果趋于1;如果a_i>>b_i:那么公式的结果趋近于-1
3.结论
如果b_i>>a_i:趋近于1效果越好,b_i<<a_i:趋近于-1,效果不好。轮廓系数的值是介于[-1,1].越趋近于1代表内聚度和分离度都相对较优。
4.轮廓系数API
sklearn.metrics.silhouette_score(X,labels)
计算所有样本的平均轮廓系数
X:特征值
labels:被聚类标记的目标值
4.6.7K-means总结
特点分析:采用迭代式算法,直观易懂并且非常实用
应用场景:没有目标值,先做聚类在做分类
缺点:容易收敛到局部最优解(多次聚类)
注意:聚类一般做在分类之前
4.7总结