机器学习(算法)
1.知识储备
Scikit-learn 许多算法实现、丰富的API
2.获取数据
1.scikit-learn数据集介绍
Scikit-learn 许多算法实现、丰富的API
2.获取数据
1.scikit-learn数据集介绍
1.scikit-learn数据集介绍
1.获取数据集 <>
1.小数据集:sklearn.datasets.load_*()
2.大数据集:sklearn.datasets.fetch_*()
2.数据集包含内容
data:特征数据数组
target:目标值数组
describe:数据描述
feature_names:特征名、新闻数据、手写数字、回归数据集没有
target_name:目标值名
3.查看数据分布
seaborn.lmplot()
x,y--分别代表横纵坐标内容
data--需要关联到的数据集
hue--最后显示的种类(目标值)
fit_reg是否进行线性拟合
4.数据集分类
1.分类
训练数据(训练集)--模型构建
测试数据(测试集)--模型评估
2.api的使用--sklearn.model_selection.train_test_split()
1.返回值:调用返回顺序
训练集的特征值
测试集的特征值
训练集的目标值
测试集的目标值
2.传入的参数
x 数据集的特征值
y数据集的目标值
test-size测试集的大小,一般为float 训练集——(70%-80%)测试集——(20%-30%)
random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的采样结果相同。
2.数据基本处理
numpy pandas
缺失值处理
缩小数据范围
异常数据处理
3.特征工程
1.定义 使机器更容易识别数据
2.包含内容
2.包含内容
1.特征预处理
为什么我们要进行归一化/标准化?
-
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
-
我们需要用到一些方法进行无量纲化,使不同规格的数据转换到同一规格
-
包含内容(数值型数据的无量纲化)
-
归一化
-
标准化
-
1.归一化
1.定义:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
2.api:sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)...)
3.小结:最大值和最小值是变化的,容易受异常点影响 鲁棒性较差只适合传统精确小数据场景
鲁棒性(Robustness)维基百科 计算机科学中,健壮性(英语:Robustness)是指一个计算机系统在执行过程中处理错误,以及算法在遭遇输入、运算等异常时继续正常运行的能力。 诸如模糊测试之类的形式化方法中,必须通过制造错误的或不可预期的输入来验证程序的健壮性。很多商业产品都可用来测试软件系统的健壮性。健壮性也是失效评定分析中的一个方面。
鲁棒性则常被用来描述可以面对复杂适应系统的能力,需要更全面的对系统进行考虑。
2.标准化
1.
数据标准化主要功能就是消除变量间的量纲关系,从而使数据具有可比性,可以举个简单的例子,一个百分制的变量与一个5分值的变量在一起怎么比较?只有通过数据标准化,都把它们标准到同一个标准时才具有可比性,一般标准化采用的是Z标准化,即均值为0,方差为1,当然也有其他标准化,比如0--1标准化等等,可根据自己的研究目的进行选择.
2.
所谓量纲,简单地说,就是单位。有一些情况下,描述一个量值,必须使用单位。比如一个物体的长度的身高,那就必须用米或者厘米等表示长度的单位,否则告诉你一个东西长度是100,那跟没说一样,100米还是100厘米? 与之相对应的,有一些量值实际上是没有单位的。比如一个物体的质量是另一个物体的10%,这个20%就是无量纲的。
1.定义:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
2.api:sklearn.preprocessing.StandardScaler()
3.小结:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景
2.特征提取
1.定义:
将任意数据(如文本或图像)转换为可用于机器学习的数字特征
2.分类
1.字典特征提取
sklearn.feature_extraction.DictVectorizer()
对于特征中存在类别信息的我们都会做one-hot编码处理
data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot','lost'] #经过one-hot编码后 [[1. 0. 0. 0.] [1. 0. 0. 0.] [0. 0. 0. 1.] [1. 0. 0. 0.] [0. 1. 0. 0.] [0. 1. 0. 0.] [0. 0. 0. 1.] [1. 0. 0. 0.] [0. 0. 0. 1.] [0. 1. 0. 0.] [0. 0. 1. 0.]]
2.文本特征提取
英文:sklearn.feature_extraction.text.CountVctoreizer()
中文:首先用 jieba.cut()
sklearn.feature_extraction.text.CountVctoreizer()
tf_idf的使用
作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
from sklearn.feature_extraction.text import TfidfVertorizer
3.图像特征提取(深度学习)
3.特征降维
1.在某种限定条件下,降低随机变量(特征)个数
2.降维的两种方式
1.特征选择
+1.过滤式
目的:删除低方差的一些特征。 (特征值接近,没用)
补充说明:
方差与协方差(可以用来求相关系数)的关系
方差是用来度量单个变量 “ 自身变异”大小的总体参数,方差越大表明该变量的变异越 大 协方差是用来度量两个变量之间 “协同变异”大小的总体参数,即二个变量相互影响大 小的参数,协方差的绝对值越大,则二个变量相互影响越大。
api: sklearn.feature_selection.VarianceThreshold(threshold=0.0) #threshold必须 指定
+2.相关系数
(1)皮尔逊相关系数
(2)判断标准:|r|<0.4 低度相关; 0.4<=|r|<=0.7 显著性相关 ; 0.7<=|r|<1 高度线性相关
+3.api:
from scipy.stats import pearsonr
2.主成分分析
定义:高维度数据转化为低维度数据的过程,在此过程中可能会舍弃原有数据,创造新的变量
api: kslearn.decomposition.PCA(n_components=None) 小数保留百分之多少 整数保留几维
4.机器学习(算法)
1.K-近邻算法(分类)
1.理解:根据最近距离,去判断你属于哪个类别
2.api:
sklearn.neighbors.KNeighborsClassifer()
参数
n_neighbors 邻居数量
algorithm:{‘auto’,‘ball_tree’,'kd_tree',‘brute’}
3.距离度量
1.欧式距离
2.曼哈顿距离
3 切比雪夫距离
4 闵可夫斯基距离
当p=1时,就是曼哈顿距离;
当p=2时,就是欧氏距离;
当p→∞时,就是切比雪夫距离。
小结:
1 闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点:
e.g. 二维样本(身高[单位:cm],体重[单位:kg]),现有三个样本:a(180,50),b(190,50),c(180,60)。
a与b的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c的闵氏距离。但实际上身高的10cm并不能和体重的10kg划等号。
2 闵氏距离的缺点:
(1)将各个分量的量纲(scale),也就是“单位”相同的看待了;
(2)未考虑各个分量的分布(期望,方差等)可能是不同的。
5.标准化欧氏距离
6 余弦距离(Cosine Distance)
几何中,夹角余弦可用来衡量两个向量方向的差异;机器学习中,借用这一概念来衡量样本向量之间的差异。
-
二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:
-
两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦为:
夹角余弦取值范围为[-1,1]。余弦越大表示两个向量的夹角越小,余弦越小表示两向量的夹角越大。当两个向量的方向重合时余弦取最大值1,当两个向量的方向完全相反余弦取最小值-1。
7 汉明距离:
两个等长字符串s1与s2的汉明距离为:将其中一个变为另外一个所需要作的最小字符替换次数。
8 杰卡德距离
9 马氏距离
4.K值的选择
KNN和K-means的区别 为什么KNN算法里的K越小模型会越复杂? 过拟合和欠拟合的偏差和方差问题_yanni0616的博客-CSDN博客_knn过拟合
1.K值过小:容易受异常点的影响 意味着整体模型变得很复杂,容易发生过拟合
为什么KNN算法里的K越小模型会越复杂?(有个小问题,这里的复杂是不就是指过拟合的意思。。因为过拟合的模型越复杂?) 参考:为什么knn算法的k越小模型会越复杂?
直观地理解,过拟合就是学习到了很多“局部信息”,或者是“噪音”,使得我们的模型中包含很多“不是规律的规律”。在knn算法中,k越小,就越有可能让我们的学习结果被“局部信息”所左右。在极端情况下,k=1,knn算法的结果只由离我们待预测样本最近的那个点决定,这使得我们knn的结果高概率被“有偏差的信息”或者“噪音”所左右,是一种过拟合。
2.K值过大:受到样本均衡的问题,k值增大意味着整体模型变得简单,容易发生欠拟合
k近邻算法_机器学习 第38集:k近邻算法k值过小和过大有什么危害?k值如何选取?( 含有笔记、代码、注释 )..._weixin_39888180的博客-CSDN博客
如果k=N(N为训练样本的个数),那么无论输入实例是什么,都将简单地预测它属于在训练实例中最多的类。
这时,模型非常简单,这相当于你压根就没有训练模型呀!直接拿训练数据统计了一下各个数据的类别,找最大的而已!
5.KD树
目标:对训练数据进行快速k紧邻搜索
kd树实现思路
构建树
构造根节点(中位数)
通过递归的方式不断地构造
直到子区域没有节点,停止
最近邻域搜索
构造一个队列,使遍历过的点在这个队列里面
是否过了超平面的判断,如果没有过,跳过,过了的话,需要把当前的子节点添加进去
循环操作,求得最近点
6.k-近邻总结
优点:简单易于理解易于实现
缺点:懒惰算法,对测试样本分类时的计算量大,内存开销大
必须指定K值,K值选择不当则分类精度不能保证
使用场景:小数据场景,几千---几万样本
2.线性回归
-
线性回归(Linear regression)是利用**回归方程(函数)**对**一个或多个自变量(特征值)和因变量(目标值)之间**关系进行建模的一种分析方式。
-
特点:只有一个自变量的情况称为单变量回归,多于一个自变量情况的叫做多元回归
线性回归(Linear regression)是利用**回归方程(函数)**对**一个或多个自变量(特征值)和因变量(目标值)之间**关系进行建模的一种分析方式。
特点:只有一个自变量的情况称为单变量回归,多于一个自变量情况的叫做多元回归
-
损失和优化
-
真实关系:真实房子价格 = 0.02×中心区域的距离 + 0.04×城市一氧化氮浓度 + (-0.12×自住房平均房价) + 0.254×城镇犯罪率
随机指定关系:预测房子价格 = 0.25×中心区域的距离 + 0.14×城市一氧化氮浓度 + 0.42×自住房平均房价 + 0.34×城镇犯罪率
存在这个误差,那我们就将这个误差给衡量出来
1.损失:最小二乘法
2.优化
正规方程 矩阵变换可以一步进行求解 适合样本小数据计算
梯度下降
1.梯度
单变量--函数的微分
多变量--向量
2.梯度下降思路
首先要指定初始值点(完全随机)
知道一个学习率(步长)
循环迭代,最后判断周围点都比我大,默认找到了‘最小点’
3.a(学习率,步长)
过大--避开了极小点 过小--耗费时间太长
4.为什么是负梯度
梯度本身值是最快上升方向
随机梯度下降法介绍及其参数讲解_u013473512的博客-CSDN博客 线性回归minibatch优化
3.api
正规方程:sklearn.liner_model.LinearRegression--
参数:fit_intercept是否计算偏置
属性:LinearRegression.coef_:回归系数 LinearRegression.intercept _:偏置
梯度下降:sklearn.linear_model.SGDRegeressor()
评估-均方误差api:sklearn.metrics.mean_squared_error(y_true,y_pred)
梯度下降法介绍
常见的梯度下降算法有:
-
全梯度下降算法(Full gradient descent),
-
随机梯度下降算法(Stochastic gradient descent),
-
随机平均梯度下降算法(Stochastic average gradient descent)
-
小批量梯度下降算法(Mini-batch gradient descent),
它们都是为了正确地调节权重向量,通过为每个权重计算一个梯度,从而更新权值,使目标函数尽可能最小化。其差别在于样本的使用方式不同。
1 全梯度下降算法(FG)
计算训练集所有样本误差,对其求和再取平均值作为目标函数。
权重向量沿其梯度相反的方向移动,从而使当前目标函数减少得最多。
因为在执行每次更新时,我们需要在整个数据集上计算所有的梯度,所以批梯度下降法的速度会很慢,同时,批梯度下降法无法处理超出内存容量限制的数据集。
批梯度下降法同样也不能在线更新模型,即在运行的过程中,不能增加新的样本。
其是在整个训练数据集上计算损失函数关于参数θ的梯度
2 随机梯度下降算法(SG)
由于FG每迭代更新一次权重都需要计算所有样本误差,而实际问题中经常有上亿的训练样本,故效率偏低,且容易陷入局部最优解,因此提出了随机梯度下降算法。
其每轮计算的目标函数不再是全体样本误差,而仅是单个样本误差,即每次只代入计算一个样本目标函数的梯度来更新权重,再取下一个样本重复此过程,直到损失函数值停止下降或损失函数值小于某个可以容忍的阈值。
此过程简单,高效,通常可以较好地避免更新迭代收敛到局部最优解。
每次只使用一个样本迭代,若遇上噪声则容易陷入局部最优解。
其中,x(i)表示一条训练样本的特征值,y(i)表示一条训练样本的标签值
但是由于,SG每次只使用一个样本迭代,若遇上噪声则容易陷入局部最优解。
3 小批量梯度下降算法(mini-bantch)
小批量梯度下降算法是FG和SG的折中方案,在一定程度上兼顾了以上两种方法的优点。
每次从训练样本集上随机抽取一个小样本集,在抽出来的小样本集上采用FG迭代更新权重。
被抽出的小样本集所含样本点的个数称为batch_size,通常设置为2的幂次方,更有利于GPU加速处理。
特别的,若batch_size=1,则变成了SG;若batch_size=n,则变成了FG.
4 随机平均梯度下降算法(SAG)
在SG方法中,虽然避开了运算成本大的问题,但对于大数据训练而言,SG效果常不尽如人意,因为每一轮梯度更新都完全与上一轮的数据和梯度无关。
随机平均梯度算法克服了这个问题,在内存中为每一个样本都维护一个旧的梯度,随机选择第i个样本来更新此样本的梯度,其他样本的梯度保持不变,然后求得所有梯度的平均值,进而更新了参数。
如此,每一轮更新仅需计算一个样本的梯度,计算成本等同于SG,但收敛速度快得多。
3.线性回归的改进-岭回归
欠拟合和过拟合
-
欠拟合原因以及解决办法
-
原因:学习到数据的特征过少
-
解决办法:
-
1)添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。
-
2)添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。
-
-
-
过拟合原因以及解决办法
-
原因:原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
-
解决办法:
-
1)重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
-
2)增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。
-
3)正则化
-
4)减少特征维度,防止维灾难
-
-
-
正则化
-
L2正则化
-
作用:可以使得其中一些W的都很小,都接近于0,削弱某个特征的影响
-
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
-
Ridge回归
-
-
L1正则化
-
作用:可以使得其中一些W的值直接为0,删除这个特征的影响
-
LASSO回归
-
1.岭回归理解:带有L2正则化的线性回归
2.api:sklearn.linear_model.Ridge()
alpha--正则化力度
slover--优先选择随机平均梯度下降法(SAG)
normalize--是否对特征值进行标准化
3.正则化力度越大,权重系数越小 力度越小权重系数越大
4.逻辑回归(分类) ——解决二分类问题 (分类评估方法,ROC曲线的绘制ROC曲线详解_哔哩哔哩_bilibili 【小萌五分钟】机器学习 | 模型评估: ROC曲线与AUC值_哔哩哔哩_bilibili)
算法检测原理
逻辑回归的输入就是一个线性回归的结果。
判断标准
-
回归的结果输入到sigmoid函数当中
-
输出结果:[0, 1]区间中的一个概率值,默认为0.5为阈值
1.激活函数--signmoid函数
2.损失: 损失函数--对数似然损失
3.优化: 同样使用梯度下降优化算法,去减少损失函数的值。这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本是0类别的概率。
4.api:sklearn.linear_model.LogisticRegression()
参数: solver--可选择梯度下降方式
penalty--正则化方式
C--正则化力度
5.决策树
1.理解:一颗由多个判断节点组成的树
2.分类原理:
1.熵: 混乱程度
2.信息增益:以某特征划分数据集前后的熵的差值
3.信息增益比:为了避免信息增益在使用的过程中,尽可能的先去选择划分类别比较多的特征作为节点
4.基尼值和基尼指数: 基尼值--从数据集中随机抽取两个样本,其类别标记不一致的概率
3.cart剪枝
4.api
5.决策树总结
6.集成学习
bagging 过拟合和 boosting 欠拟合
bagging: 多个分类器 平权投票 过程:采样 学习 集成
随机森林: bagging+决策树
随机森林够造过程中的关键步骤(用N来表示训练用例(样本)的个数,M表示特征数目):
1)一次随机选出一个样本,有放回的抽样,重复N次(有可能出现重复的样本)
2) 随机去选出m个特征, m < 1.使用梯度下降法优化代价函数; 2.使用一层决策树作为弱学习器,负梯度作为目标值; 3.利用boosting思想进行集成。 1.无监督学习 多分类-将相似的样本自动归到一个类别中 组内距离最小化 组间距离最大化 2.api:sklearn.cluster.KMeans() 参数: n_clusters:开始的聚类中心数量 3.实现流程 1.确定常数K 2.选定初始点为质心 3.重新计算每个类的质心 4.重复上述过程,直到质心不再改变 4.误差评估 1.肘部法下降率突然变缓时即认为是最佳的k值 2.SC系数取值为[-1,1]值越大越好 3.ch系数 分数s越高效果越好 5.算法优化 交叉验证 为了让从训练得到的模型结果更加准确 ,把数据再进行划分。 训练集:训练集+验证集 测试集:测试集 网格搜索:对模型预设几种超参数组合,最后选出最优参数组合建立模型 api:sklearn.model_selecyion.GridSearchCV(estimator,param_grid=None,cv=None) 参数: estimator:估计器对象 param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]} cv:指定几折交叉验证 方法: fit:输入训练数据 score:准确率 属性: best_score_:在交叉验证中验证的最好结果 best_estimatror_:最好的参数模型 cv_results_:每次交叉验证后的验证集准确率结果和训练集准确率结果 欠拟合:模型过于简单,在训练数据和测试数据上都不能得到很好的拟合 增加数据的特征数量 过拟合:模型过于复杂 在训练数据上可以得到很好的拟合,但是再测试数据上得不到很好的拟合 正则化 api: form sklearn.externals import joblib 保存:joblib.dump(rf,"test.pkl") 加载:estimator = joblib.load("test.pkl") 目录 机器学习(算法) 1.知识储备 Scikit-learn 许多算法实现、丰富的API 2.获取数据 1.scikit-learn数据集介绍 2.数据集包含内容 3.查看数据分布 4.数据集分类 2.数据基本处理 numpy pandas 3.特征工程 1.定义 使机器更容易识别数据 2.包含内容 4.机器学习(算法) 1.K-近邻算法(分类) 2.线性回归 3.线性回归的改进-岭回归 4.逻辑回归(分类) ——解决二分类问题 (分类评估方法,ROC曲线的绘制ROC曲线详解_哔哩哔哩_bilibili 【小萌五分钟】机器学习 | 模型评估: ROC曲线与AUC值_哔哩哔哩_bilibili) 5.决策树 6.集成学习 GBDT主要执行思想 7.K-means 其他内容 1.模型选择与调优 2.欠拟合和过拟合 3.模型保存与加载GBDT主要执行思想
7.K-means
其他内容
1.模型选择与调优
2.欠拟合和过拟合
3.模型保存与加载



