一、基本概念与安装
-
安装
- 可以使用
pip install -U scikit - learn
命令在命令行中进行安装。如果使用Anaconda环境,也可以通过Anaconda Navigator或conda install scikit - learn
进行安装。
- 可以使用
-
依赖关系
- 它依赖于NumPy(用于高效的数值计算,如数组操作)和SciPy(提供了许多科学计算算法,如优化、线性代数等)。同时,对于数据可视化等任务,它可以与Matplotlib等库配合使用。
二、数据表示与预处理
-
数据结构
- 数据集表示:通常使用二维数组(类似矩阵)来表示数据集。每一行代表一个样本,每一列代表一个特征。例如,在一个包含鸢尾花数据集(有4个特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度)的例子中,数据集可能是一个形状为
(n_samples, 4)
的数组,其中n_samples
是样本的数量。 - 标签表示:分类任务中的标签通常是一个一维数组,其长度与样本数量相同,每个元素对应一个样本的类别标签。在鸢尾花数据集中,如果是一个三分类问题(山鸢尾、变色鸢尾、维吉尼亚鸢尾),标签数组的形状为
(n_samples,)
。
- 数据集表示:通常使用二维数组(类似矩阵)来表示数据集。每一行代表一个样本,每一列代表一个特征。例如,在一个包含鸢尾花数据集(有4个特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度)的例子中,数据集可能是一个形状为
-
数据预处理
-
标准化(Standardization)
- 公式为
X_std = (X - X.mean(axis = 0)) / X.std(axis = 0)
,其中X
是原始数据。例如,对于一个特征列,通过减去均值并除以标准差,将其转换为均值为0,标准差为1的分布。这在很多机器学习算法(如支持向量机)中是很重要的预处理步骤,因为这些算法对特征的尺度敏感。
- 公式为
-
归一化(Normalization)
- 常用的是将数据归一化到区间
[0, 1]
,公式为X_norm=(X - X.min(axis = 0))/(X.max(axis = 0)-X.min(axis = 0))
。归一化在一些基于距离度量的算法(如K - 近邻算法)中很有用,因为它可以确保不同特征对距离计算的贡献相对公平。
- 常用的是将数据归一化到区间
-
缺失值处理
- 可以使用
SimpleImputer
类。例如,对于数值型数据,from sklearn.impute import SimpleImputer
,然后通过imputer = SimpleImputer(strategy='mean')
(这里以均值填充为例)来处理缺失值,再使用imputer.fit_transform(X)
对数据X
进行实际的填充操作。
- 可以使用
-
特征编码
- 独热编码(One - Hot Encoding):对于分类特征,使用
OneHotEncoder
。例如,一个有3个类别(如颜色:红、绿、蓝)的分类特征,经过独热编码后会变成一个三维的二进制向量(如[1,0,0]表示红色,[0,1,0]表示绿色,[0,0,1]表示蓝色)。 - 标签编码(Label Encoding):将分类标签转换为整数编码。通过
LabelEncoder
类实现,比如对于标签为['cat', 'dog', 'bird']的数据集,可以将其转换为[0, 1, 2],方便一些机器学习算法处理。
- 独热编码(One - Hot Encoding):对于分类特征,使用
-
三、监督学习算法
-
分类算法
- K - 近邻分类器(K - Nearest Neighbors Classifier)
- 原理:基于样本之间的距离,对于一个新的样本,找到与其距离最近的
k
个邻居,然后根据这k
个邻居中多数的类别来确定新样本的类别。例如,在一个二维特征空间中,计算新样本点到所有训练样本点的距离(如欧几里得距离),选择距离最近的k
个点,统计这些点所属的类别,类别最多的那个就是新样本的预测类别。 - 主要参数:
n_neighbors
(即k
值),它决定了要考虑多少个近邻来进行分类。较小的k
值可能导致模型对噪声敏感,而较大的k
值可能使模型过于平滑,忽略了局部特征。
- 原理:基于样本之间的距离,对于一个新的样本,找到与其距离最近的
- 决策树分类器(Decision Tree Classifier)
- 原理:通过构建一棵树来进行分类。从根节点开始,根据特征的不同取值进行分支,直到叶节点,叶节点代表类别。例如,对于一个判断水果是苹果还是橙子的决策树,可能首先根据颜色分支(如果是红色可能是苹果,绿色可能是橙子),然后再根据形状等其他特征进一步分支。
- 主要参数:
max_depth
(树的最大深度),它控制树的复杂度。较浅的树可能会欠拟合,而太深的树可能会过拟合数据。
- 支持向量机分类器(Support Vector Machine Classifier)
- 原理:寻找一个超平面来划分不同的类别,使得不同类别之间的间隔最大。在二维空间中,超平面是一条直线,在三维空间中是一个平面,在更高维空间中是一个超平面。例如,对于一个二分类问题,它试图找到一条直线,使得两类样本尽可能地分布在直线的两侧,并且直线到两类样本的最近点的距离(即间隔)最大。
- 主要参数:
C
(惩罚参数),它控制对错误分类的惩罚程度。C
值越大,对错误分类的惩罚越大,模型可能会更复杂,容易过拟合;C
值越小,模型可能会更简单,容易欠拟合。
- 朴素贝叶斯分类器(Naive Bayes Classifier)
- 原理:基于贝叶斯定理,假设特征之间相互独立,计算后验概率来确定类别。例如,对于文本分类问题,假设每个单词的出现与否与其他单词是独立的,根据训练数据计算每个类别下单词出现的概率,然后对于新的文本,计算它属于各个类别的概率,概率最高的类别就是预测类别。
- 主要参数:不同的朴素贝叶斯模型(如高斯朴素贝叶斯、多项式朴素贝叶斯等)有不同的参数。例如,高斯朴素贝叶斯有
var_smoothing
参数,用于防止方差计算为0的情况。
- K - 近邻分类器(K - Nearest Neighbors Classifier)
-
回归算法
-
线性回归(Linear Regression)
- 原理:试图找到一条直线(在高维空间是一个超平面)来拟合数据。其模型公式为
y = w0 + w1*x1+w2*x2 +...+ wn*xn
,其中y
是目标变量,x1,x2,...,xn
是特征变量,w0,w1,...,wn
是模型的系数。通过最小化预测值与真实值之间的平方差(即最小二乘法)来确定系数。例如,在一个简单的房价预测问题中,x
可能是房屋面积等特征,y
是房价,通过线性回归找到面积等特征与房价之间的线性关系。 - 主要参数:在Scikit - learn中,可以设置
fit_intercept
参数来决定是否拟合截距项(w0
)。
- 原理:试图找到一条直线(在高维空间是一个超平面)来拟合数据。其模型公式为
-
岭回归(Ridge Regression)
- 原理:在线性回归的基础上,加入了L2正则化项。正则化项的目的是防止过拟合,它对系数进行惩罚。岭回归的损失函数为
J(w)=(y - Xw)^2 + alpha * ||w||^2
,其中alpha
是正则化强度参数。当alpha
增大时,系数会被更多地惩罚,模型变得更简单。 - 主要参数:
alpha
,它控制正则化的强度。
- 原理:在线性回归的基础上,加入了L2正则化项。正则化项的目的是防止过拟合,它对系数进行惩罚。岭回归的损失函数为
-
Lasso回归(Least Absolute Shrinkage and Selection Operator Regression)
- 原理:加入了L1正则化项,其损失函数为
J(w)=(y - Xw)^2+alpha*||w||_1
。L1正则化有一个特点是可以使一些系数变为0,从而起到特征选择的作用。例如,在一个多特征回归问题中,Lasso回归可能会将一些不重要的特征对应的系数收缩为0,从而简化模型。 - 主要参数:
alpha
,用于控制正则化强度。
- 原理:加入了L1正则化项,其损失函数为
-
支持向量回归(Support Vector Regression)
- 原理:类似于支持向量机分类器,试图找到一个超平面,使得大部分样本点都在这个超平面的一定范围内(称为epsilon - 不敏感带)。例如,在预测时间序列数据时,它可以找到一个超平面来拟合数据,并且对一定范围内的误差不敏感。
- 主要参数:
C
(惩罚参数)和epsilon
(不敏感带的宽度)。
-
四、无监督学习算法
-
聚类算法
- K - 均值聚类(K - Means Clustering)
- 原理:将数据集划分为
k
个簇。首先随机初始化k
个聚类中心,然后将每个样本分配到距离其最近的聚类中心所属的簇,接着更新聚类中心(计算每个簇内样本的均值作为新的聚类中心),重复这个过程直到聚类中心不再变化或者达到最大迭代次数。例如,对于一个包含客户购买行为数据的数据集,可以使用K - 均值聚类将客户分为不同的群体,以便进行针对性的营销。 - 主要参数:
n_clusters
(即k
值),它决定了要划分的簇的数量。
- 原理:将数据集划分为
- 层次聚类(Hierarchical Clustering)
- 原理:有两种类型,凝聚式和分裂式。凝聚式是从每个样本作为一个单独的簇开始,不断合并相似的簇;分裂式是从所有样本都在一个簇开始,不断分裂簇。例如,在生物分类中,可以使用层次聚类将物种按照相似性进行分类,从最底层的个体逐步合并为更高层次的分类单元。
- 主要参数:
linkage
(用于确定如何计算簇之间的距离,如单链接、全链接、平均链接等)。
- K - 均值聚类(K - Means Clustering)
-
降维算法
- 主成分分析(Principal Component Analysis,PCA)
- 原理:通过线性变换将原始数据转换到一个新的坐标系中,使得数据在新坐标系的第一主成分(方差最大的方向)、第二主成分(与第一主成分正交且方差次大的方向)等方向上的方差依次递减。例如,对于一个高维的图像数据集,PCA可以将其降维到较低维度,同时保留数据的主要信息,这样可以用于数据可视化或者减少后续机器学习模型的计算量。
- 主要参数:
n_components
,它指定要保留的主成分的数量,可以是一个整数(表示要保留的主成分的个数)或者一个小数(表示要保留的方差比例)。
- 奇异值分解(Singular Value Decomposition,SVD)
- 原理:对于一个矩阵
A
,可以分解为A = U * S * V.T
,其中U
和V
是正交矩阵,S
是对角矩阵。在数据降维中,可以利用SVD来提取数据的主要特征。例如,在文本处理中,SVD可以用于提取文档 - 词矩阵的主要特征,实现潜在语义分析。
- 原理:对于一个矩阵
- 主成分分析(Principal Component Analysis,PCA)
五、模型评估与选择
-
分类模型评估指标
- 准确率(Accuracy)
- 定义:正确分类的样本数占总样本数的比例。计算公式为
accuracy=(TP + TN)/(TP + TN+FP + FN)
,其中TP
(真阳性)是实际为正类且被预测为正类的样本数,TN
(真阴性)是实际为负类且被预测为负类的样本数,FP
(假阳性)是实际为负类但被预测为正类的样本数,FN
(假阴性)是实际为正类但被预测为负类的样本数。例如,在一个医学诊断分类问题中,如果有100个样本,其中80个被正确诊断,那么准确率就是80%。
- 定义:正确分类的样本数占总样本数的比例。计算公式为
- 精确率(Precision)
- 定义:预测为正类的样本中真正为正类的比例。计算公式为
precision = TP/(TP + FP)
。在信息检索中,精确率表示检索出的相关文档占检索出的所有文档的比例。
- 定义:预测为正类的样本中真正为正类的比例。计算公式为
- 召回率(Recall)
- 定义:实际为正类的样本中被预测为正类的比例。计算公式为
recall=TP/(TP + FN)
。在欺诈检测中,召回率表示被正确检测出的欺诈案例占所有欺诈案例的比例。
- 定义:实际为正类的样本中被预测为正类的比例。计算公式为
- F1 - score
- 定义:是精确率和召回率的调和平均数,计算公式为
F1 = 2 * precision * recall/(precision + recall)
。它综合考虑了精确率和召回率,在一些需要平衡两者的场景(如分类不平衡问题)中很有用。
- 定义:是精确率和召回率的调和平均数,计算公式为
- 准确率(Accuracy)
-
回归模型评估指标
- 均方误差(Mean Squared Error,MSE)
- 定义:计算预测值与真实值之间的平方差的平均值。计算公式为
MSE = 1/n * sum((y_pred - y_true)^2)
,其中n
是样本数量,y_pred
是预测值,y_true
是真实值。例如,在预测股票价格时,MSE可以衡量预测价格与实际价格之间的误差大小。
- 定义:计算预测值与真实值之间的平方差的平均值。计算公式为
- 均方根误差(Root Mean Squared Error,RMSE)
- 定义:是MSE的平方根。它与预测值和真实值的单位相同,更直观地反映了误差的大小。
- 平均绝对误差(Mean Absolute Error,MAE)
- 定义:计算预测值与真实值之间的绝对差值的平均值。计算公式为
MAE = 1/n * sum(|y_pred - y_true|)
。与MSE相比,MAE对异常值的敏感度较低。
- 定义:计算预测值与真实值之间的绝对差值的平均值。计算公式为
- 均方误差(Mean Squared Error,MSE)
-
模型选择方法
- 交叉验证(Cross - Validation)
- 原理:将数据集划分为
k
个大小相似的子集(k - fold
交叉验证),每次用k - 1
个子集作为训练集,剩下的一个子集作为验证集,重复k
次,最后计算平均的评估指标。例如,对于一个有100个样本的数据集,进行5 - fold交叉验证,就是将数据集分为5个子集,每个子集20个样本,然后进行5次训练 - 验证过程,每次选择不同的子集作为验证集。 - 作用:可以更准确地评估模型的性能,避免过拟合评估集,并且可以用于比较不同模型的性能。
- 原理:将数据集划分为
- 网格搜索(Grid Search)
- 原理:对于一个模型的多个参数,设定一个参数取值的网格,通过穷举所有可能的参数组合,使用交叉验证来评估每个组合的性能,最后选择性能最好的参数组合。例如,对于一个支持向量机模型,可能有参数
C
和gamma
,通过设定C
的取值范围为[0.1, 1, 10]
,gamma
的取值范围为[0.01, 0.1, 1]
,进行网格搜索,会评估9种不同的参数组合,找到最优的组合。
- 原理:对于一个模型的多个参数,设定一个参数取值的网格,通过穷举所有可能的参数组合,使用交叉验证来评估每个组合的性能,最后选择性能最好的参数组合。例如,对于一个支持向量机模型,可能有参数
- 交叉验证(Cross - Validation)
六、模型保存与加载
- 保存模型
- 可以使用
joblib
模块。例如,对于一个训练好的模型model
,from sklearn.externals import joblib
(在较新的Scikit - learn版本中可能不需要externals
),然后使用joblib.dump(model,'model.pkl')
将模型保存为model.pkl
文件。
- 可以使用
- 加载模型
- 使用
joblib.load('model.pkl')
来加载之前保存的模型,加载后可以直接用于预测等操作。
- 使用