机器学习总结

发布于:2025-08-17 ⋅ 阅读:(12) ⋅ 点赞:(0)

KNN

数据集的划分
机器学习⼀般的数据集会划分为两个部分:
训练数据:⽤于训练,构建模型
测试数据:在模型检验时使⽤,⽤于评估模型是否有效
29案例1:鸢尾花种类预测--数据集介绍
划分⽐例:
训练集:70% 80% 75%
测试集:30% 20% 25%
数据集划分api
sklearn.model_selection.train_test_split(arrays, *options)
参数:
x 数据集的特征值
y 数据集的标签值
test_size 测试集的⼤⼩,⼀般为float
random_state 随机数种⼦,不同的种⼦会造成不同的随机采样结果。相同的种⼦采样结果相同。
return
x_train, x_test, y_train, y_test
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 1、获取鸢尾花数据集
iris = load_iris()
# 对鸢尾花数据集进⾏分割
# 训练集的特征值x_train 测试集的特征值x_test 训练集的⽬标值y_train 测试集的⽬标值y_test
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
print("x_train:\n", x_train.shape)
# 随机数种⼦
x_train1, x_test1, y_train1, y_test1 = train_test_split(iris.data, iris.target, random_state=6)
x_train2, x_test2, y_train2, y_test2 = train_test_split(iris.data, iris.target, random_state=6)
print("如果随机数种⼦不⼀致:\n", x_train == x_train1)
print("如果随机数种⼦⼀致:\n", x_train1 == x_train2)
总结
获取数据集【知道】
⼩数据:
sklearn.datasets.load_*
⼤数据集:
sklearn.datasets.fetch_*
数据集返回值介绍【知道】
返回值类型是bunch--是⼀个字典类型
返回值的属性:
data:特征数据数组
target:标签(⽬标)数组
DESCR:数据描述
feature_names:特征名,
target_names:标签(⽬标值)
数据集的划分【掌握】
sklearn.model_selection.train_test_split(arrays, *options)
参数:
x -- 特征值
y -- ⽬标值
test_size -- 测试集⼤⼩
ramdom_state -- 随机数种⼦
返回值:
x_train, x_test, y_train, y_test

归⼀化

2.1 定义
通过对原始数据进⾏变换把数据映射到(默认为[0,1])之间
2.2 公式
API
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
MinMaxScalar.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
1、实例化MinMaxScalar
2、通过fit_transform转换
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def minmax_demo():
"""
归⼀化演示
:return: None
"""
data = pd.read_csv("./data/dating.txt")
print(data)
# 1、实例化⼀个转换器类
transfer = MinMaxScaler(feature_range=(2, 3))
# 2、调⽤fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("最⼩值最⼤值归⼀化处理的结果:\n", data)
return None
返回结果:
34特征⼯程-特征预处理
milage Liters Consumtime target
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
3 75136 13.147394 0.428964 1
.. ... ... ... ...
998 48111 9.134528 0.728045 3
999 43757 7.882601 1.332446 3
[1000 rows x 4 columns]
最⼩值最⼤值归⼀化处理的结果:
[[ 2.44832535 2.39805139 2.56233353]
[ 2.15873259 2.34195467 2.98724416]
[ 2.28542943 2.06892523 2.47449629]
...,
[ 2.29115949 2.50910294 2.51079493]
[ 2.52711097 2.43665451 2.4290048 ]
[ 2.47940793 2.3768091 2.78571804]]

归⼀化总结

注意最⼤值最⼩值是变化的,另外,最⼤值与最⼩值⾮常容易受异常点影响,所以这种⽅法鲁棒性较差,只适合传统精确⼩数据场景。

标准化

3.1 定义
通过对原始数据进⾏变换把数据变换到均值为0,标准差为1范围内
3.2 公式
作⽤于每⼀列,mean为平均值,σ为标准差
所以回到刚才异常点的地⽅,我们再来看看标准化
对于归⼀化来说:如果出现异常点,影响了最⼤值和最⼩值,那么结果显然会发⽣改变
对于标准化来说:如果出现异常点,由于具有⼀定数据量,少量的异常点对于平均值的影响并不⼤,从⽽⽅差改变较⼩。
API
sklearn.preprocessing.StandardScaler( )
处理之后每列来说所有数据都聚集在均值0附近标准差差为1
StandardScaler.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
3.4 数据计算
同样对上⾯的数据进⾏处理
分析
1、实例化StandardScaler
2、通过fit_transform转换
36特征⼯程-特征预处理
import pandas as pd
from sklearn.preprocessing import StandardScaler
def stand_demo():
"""
标准化演示
:return: None
"""
data = pd.read_csv("dating.txt")
print(data)
# 1、实例化⼀个转换器类
transfer = StandardScaler()
# 2、调⽤fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("标准化的结果:\n", data)
print("每⼀列特征的平均值:\n", transfer.mean_)
print("每⼀列特征的⽅差:\n", transfer.var_)
return None
返回结果:
milage Liters Consumtime target
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
.. ... ... ... ...
997 26575 10.650102 0.866627 3
998 48111 9.134528 0.728045 3
999 43757 7.882601 1.332446 3
[1000 rows x 4 columns]
标准化的结果:
[[ 0.33193158 0.41660188 0.24523407]
[-0.87247784 0.13992897 1.69385734]
[-0.34554872 -1.20667094 -0.05422437]
...,
[-0.32171752 0.96431572 0.06952649]
[ 0.65959911 0.60699509 -0.20931587]
[ 0.46120328 0.31183342 1.00680598]]
每⼀列特征的平均值:
[ 3.36354210e+04 6.55996083e+00 8.32072997e-01]
每⼀列特征的⽅差:
[ 4.81628039e+08 1.79902874e+01 2.46999554e-01]

3.5 标准化总结

在已有样本⾜够多的情况下⽐较稳定,适合现代嘈杂⼤数据场景。
总结
什么是特征⼯程【知道】
定义
通过⼀些转换函数将特征数据转换成更加适合算法模型的特征数据过程
包含内容:
归⼀化
标准化
归⼀化【知道】
定义:
对原始数据进⾏变换把数据映射到(默认为[0,1])之间
api:
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
参数:feature_range -- ⾃⼰指定范围,默认0-1
总结:
鲁棒性⽐较差(容易受到异常点的影响)
只适合传统精确⼩数据场景(以后不会⽤你了)
标准化【掌握】
定义:
对原始数据进⾏变换把数据变换到均值为0,标准差为1范围内
api:
sklearn.preprocessing.StandardScaler( )
总结:
异常值对我影响⼩
适合现代嘈杂⼤数据场景(以后就是⽤你了)

1 再识K-近邻算法API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
n_neighbors
int,可选(默认= 5),k_neighbors查询默认使⽤的邻居数
algorithm{‘auto’‘ball_tree’‘kd_tree’‘brute’}
快速k近邻搜索算法,默认参数为auto,可以理解为算法⾃⼰决定合适的搜索算法。除此之外,⽤户也可
以⾃⼰指定搜索算法ball_treekd_treebrute⽅法进⾏搜索,
brute是蛮⼒搜索,也就是线性扫描,当训练集很⼤时,计算⾮常耗时。
kd_tree,构造kd树存储数据以便对其进⾏快速检索的树形数据结构,kd树也就是数据结构中的⼆叉 树。以中值切分构造的树,每个结点是⼀个超矩形,在维数⼩于20时效率⾼。
ball tree是为了克服kd树⾼维失效⽽发明的,其构造过程是以质⼼C和半径r分割样本空间,每个节点是⼀个超球体。

KNN算法总结

k近邻算法优缺点汇总
优点:
简单有效
重新训练的代价低
适合类域交叉样本
KNN⽅法主要靠周围有限的邻近的样本,⽽不是靠判别类域的⽅法来确定所属类别的,因此对于类域的交
叉或重叠较多的待分样本集来说,KNN⽅法较其他⽅法更为适合。
适合⼤样本⾃动分类
该算法⽐较适⽤于样本容量⽐较⼤的类域的⾃动分类,⽽那些样本容量较⼩的类域采⽤这种算法⽐较容易
产⽣误分
缺点:
惰性学习
KNN算法是懒散学习⽅法(lazy learning,基本上不学习),⼀些积极学习的算法要快很多
类别评分不是规格化
不像⼀些通过概率评分的分类
输出可解释性不强
例如决策树的输出可解释性就较强
对不均衡的样本不擅⻓
当样本不平衡时,如⼀个类的样本容量很⼤,⽽其他类样本容量很⼩时,有可能导致当输⼊⼀个新样本 时,该样本的K个邻居中⼤容量类的样本占多数。该算法只计算最近的邻居样本,某⼀类的样本数量很 ⼤,那么或者这类样本并不接近⽬标样本,或者这类样本很靠近⽬标样本。⽆论怎样,数量并不能影响运⾏结果。可以采⽤权值的⽅法(和该样本距离⼩的邻居权值⼤)来改进。
计算量较⼤
⽬前常⽤的解决⽅法是事先对已知样本点进⾏剪辑,事先去除对分类作⽤不⼤的样本。
交叉验证,⽹格搜索
什么是交叉验证(cross validation)
交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中⼀份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。⼜称4折交叉验证。
分析
我们之前知道数据分为训练集和测试集,但是为了让从训练得到模型结果更加准确。做以下处理
训练集:训练集+验证集
测试集:测试集
为什么需要交叉验证
交叉验证⽬的:为了让被评估的模型更加准确可信
问题:这个只是让被评估的模型更加准确可信,那么怎么选择或者调优参数呢?
总结
交叉验证【知道】
定义:
将拿到的训练数据,分为训练和验证集
*折交叉验证
分割⽅式:
训练集:训练集+验证集
测试集:测试集
为什么需要交叉验证
为了让被评估的模型更加准确可信
注意:交叉验证不能提⾼模型的准确率

线性回归

⼩结
线性回归的定义【了解】
利⽤回归⽅程(函数)⼀个或多个⾃变量(特征值)和因变量(⽬标值)之间关系进⾏建模的⼀种分析⽅式
线性回归的分类【知道】
线性关系
⾮线性关系
线性回归api初步使⽤
线性回归API
sklearn.linear_model.LinearRegression()
LinearRegression.coef_:回归系数
导⼊模块
from sklearn.linear_model import LinearRegression
构造数据集
x = [[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]]
y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]
机器学习-- 模型训练
# 实例化API
estimator = LinearRegression()
# 使⽤fit⽅法进⾏训练
estimator.fit(x,y)
estimator.coef_
estimator.predict([[100, 80]])
⼩结
sklearn.linear_model.LinearRegression()
LinearRegression.coef_:回归系数

线性回归的损失和优化

学习⽬标
知道线性回归中损失函数
知道使⽤正规⽅程对损失函数优化的过程
知道使⽤梯度下降法对损失函数优化的过程
总损失定义为:
yi为第i个训练样本的真实值
h(xi )为第i个训练样本特征值组合预测函数
⼜称最⼩⼆乘法
其中y是真实值矩阵,X是特征值矩阵,w是权重矩阵
对其求解关于w的最⼩值,起⽌y,X 均已知⼆次函数直接求导,导数为零的位置,即为最⼩值。
求导:

梯度下降(Gradient Descent)

2.2.1 什么是梯度下降
梯度下降法的基本思想可以类⽐为⼀个下⼭的过程。
假设这样⼀个场景:
⼀个⼈被困在⼭上,需要从⼭上下来(i.e. 找到⼭的最低点,也就是⼭⾕)。但此时⼭上的浓雾很⼤,导致可视度很低。
因此,下⼭的路径就⽆法确定,他必须利⽤⾃⼰周围的信息去找到下⼭的路径。这个时候,他就可以利⽤梯度下降算法
来帮助⾃⼰下⼭。
具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地⽅,然后朝着⼭的⾼度下降的地⽅⾛,(同
理,如果我们的⽬标是上⼭,也就是爬到⼭顶,那么此时应该是朝着最陡峭的⽅向往上⾛)。然后每⾛⼀段距离,都反
复采⽤同⼀个⽅法,最后就能成功的抵达⼭⾕。
梯度下降的基本过程就和下⼭的场景很类似。
⾸先,我们有⼀个可微分的函数。这个函数就代表着⼀座⼭。
我们的⽬标就是找到这个函数的最⼩值,也就是⼭底。
根据之前的场景假设,最快的下⼭的⽅式就是找到当前位置最陡峭的⽅向,然后沿着此⽅向向下⾛,对应到函数中,就
找到给定点的梯度 ,然后朝着梯度相反的⽅向,就能让函数值下降的最快!因为梯度的⽅向就是函数值变化最快的
⽅向。 所以,我们重复利⽤这个⽅法,反复求取梯度,最后就能到达局部的最⼩值,这就类似于我们下⼭的过程。⽽
求取梯度就确定了最陡峭的⽅向,也就是场景中测量⽅向的⼿段。
2.2.2 梯度的概念
梯度是微积分中⼀个很重要的概念
在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率;
在多变量函数中,梯度是⼀个向量,向量有⽅向,梯度的⽅向就指出了函数在给定点的上升最快的⽅向;
在微积分⾥⾯,对多元函数的参数求偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是
梯度。
这也就说明了为什么我们需要千⽅百计的求取梯度!我们需要到达⼭底,就需要在每⼀步观测到此时最陡峭的地⽅,梯
度就恰巧告诉了我们这个⽅向。梯度的⽅向是函数在给定点上升最快的⽅向,那么梯度的反⽅向就是函数在给定点下降
最快的⽅向,这正是我们所需要的。所以我们只要沿着梯度的反⽅向⼀直⾛,就能⾛到局部的最低点!
梯度下降举例
1. 单变量函数的梯度下降**
我们假设有⼀个单变量的函数 :J(θ) = θ 2
函数的微分:J(θ) = 2θ
初始化,起点为: θ 0 = 1
学习率:α = 0.4
多变量函数的梯度下降
我们假设有⼀个⽬标函数 ::J(θ) = θ1 2 + θ2 2
现在要通过梯度下降法计算这个函数的最⼩值。我们通过观察就能发现最⼩值其实就是 (00)点。但是接下 来,我们
会从梯度下降算法开始⼀步步计算到这个最⼩值! 我们假设初始的起点为: θ 0 = (1, 3)
初始的学习率为:α = 0.1
函数的梯度为::J(θ) =< 2θ1 ,2θ2>
进⾏多次迭代:
梯度下降(Gradient Descent)公式
梯度下降法 循序渐进【知道】
梯度的概念
单变量 -- 切线
多变量 -- 向量
梯度下降法中关注的两个参数
α -- 就是步⻓
步⻓太⼩ -- 下⼭太慢
步⻓太⼤ -- 容易跳过极⼩值点(*)
为什么梯度要加⼀个负号
梯度⽅向是上升最快⽅向,负号就是下降最快⽅向

梯度下降⽅法介绍

详解梯度下降算法
1.1梯度下降的相关概念复习
在详细了解梯度下降的算法之前,我们先复习相关的⼀些概念。
步⻓(Learning rate)
步⻓决定了在梯度下降迭代的过程中,每⼀步沿梯度负⽅向前进的⻓度。⽤前⾯下⼭的例⼦,步⻓就是在当前
这⼀步所在位置沿着最陡峭最易下⼭的位置⾛的那⼀步的⻓度。
特征(feature)
指的是样本中输⼊部分,⽐如2个单特征的样本(x (0) , y (0)),(x (1) , y (1)),则第⼀个样本特征为x (0),第⼀个样本输
出为y (0)
假设函数(hypothesis function)
在监督学习中,为了拟合输⼊样本,⽽使⽤的假设函数,记为hθ(x)⽐如对于单个特征的m个样本
(x (i) , y (i))(i = 1, 2, ...m),可以采⽤拟合函数如下: hθ(x) = θ0 + θ1x
损失函数(loss function)
为了评估模型拟合的好坏,通常⽤损失函数来度量拟合的程度。损失函数极⼩化,意味着拟合程度最好,对应
的模型参数即为最优参数。
在线性回归中,损失函数通常为样本输出和假设函数的差取平⽅。⽐如对于m个样本(xi, yi)(i = 1, 2, ...m),采
⽤线性回归,损失函数为
梯度下降法的推导流程
1) 先决条件: 确认优化模型的假设函数和损失函数。
⽐如对于线性回归,假设函数表示为 hθ(x1, x2, ..., xn) = θ0 + θ1x1 + ... + θnxn, 其中θi(i = 0, 1, 2...n)为模型参数,
xi(i = 0, 1, 2...n)为每个样本的n个特征值。这个表示可以简化,我们增加⼀个特征x0 = 1 ,这样

梯度下降法⼤家族

⾸先,我们来看⼀下,常⻅的梯度下降算法有:
全梯度下降算法(Full gradient descent),
随机梯度下降算法(Stochastic gradient descent),
⼩批量梯度下降算法(Mini-batch gradient descent),
随机平均梯度下降算法(Stochastic average gradient descent)
它们都是为了正确地调节权重向量,通过为每个权重计算⼀个梯度,从⽽更新权值,使⽬标函数尽可能最⼩化。其差别在于样本的使⽤⽅式不同。

线性回归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_:偏置

回归性能评估

均⽅误差(Mean Squared Error)MSE)评价机制:
注:y i为预测值,y 为真实值
sklearn.metrics.mean_squared_error(y_true, y_pred)
均⽅误差回归损失
y_true:真实值
y_pred:预测值
return:浮点数结果

⽋拟合和过拟合

学习⽬标
掌握过拟合、⽋拟合的概念
掌握过拟合、⽋拟合产⽣的原因
知道什么是正则化,以及正则化的分类
1 定义
过拟合:⼀个假设在训练数据上能够获得⽐其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据
此时认为这个假设出现了过拟合的现象。(模型过于复杂)
⽋拟合:⼀个假设在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据,此时认为这个
假设出现了⽋拟合的现象。(模型过于简单)
原因以及解决办法
⽋拟合原因以及解决办法
原因:学习到数据的特征过少
解决办法:
1)添加其他特征项,有时候我们模型出现⽋拟合的时候是因为特征项不够导致的,可以添加其他特征项
来很好地解决。例如,组合泛化相关性三类特征是特征添加的重要⼿段,⽆论在什么场景,都可 以照葫芦画瓢,总会得到意想不到的效果。除上⾯的特征之外,“上下⽂特征平台特征等等,都可以
作为特征添加的⾸选项。
2)添加多项式特征,这个在机器学习算法⾥⾯⽤的很普遍,例如将线性模型通过添加⼆次项或者三次项
使模型泛化能⼒更强。
过拟合原因以及解决办法
原因:原始特征过多,存在⼀些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
解决办法:
1)重新清洗数据,导致过拟合的⼀个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重
新清洗数据。
2)增⼤数据的训练量,还有⼀个原因就是我们⽤于训练的数据量太⼩导致的,训练数据占总数据的⽐例
过⼩。
3)正则化
4)减少特征维度,防⽌维灾难

正则化类别

L2正则化
作⽤:可以使得其中⼀些W的都很⼩,都接近于0,削弱某个特征的影响
优点:越⼩的参数说明模型越简单,越简单的模型则越不容易产⽣过拟合现象
Ridge回归
L1正则化
作⽤:可以使得其中⼀些W的值直接为0,删除这个特征的影响
LASSO回归
⼩结
⽋拟合【掌握】
在训练集上表现不好,在测试集上表现不好
解决⽅法:
继续学习
1.添加其他特征项
2.添加多项式特征
过拟合【掌握】
在训练集上表现好,在测试集上表现不好
解决⽅法:
1.重新清洗数据集
2.增⼤数据的训练量
3.正则化
4.减少特征维度
正则化【掌握】
通过限制⾼次项的系数进⾏防⽌过拟合
L1正则化
理解:直接把⾼次项前⾯的系数变为0
Lasso回归
L2正则化
理解:把⾼次项前⾯的系数变成特别⼩的值
岭回归

网站公告

今日签到

点亮在社区的每一天
去签到