sklearn机器学习的常用知识点(一)

sklearn提供了非常的模块,包含机器学习很多常用的算法类,预处理方法和模型评估方法,本文章将常见的进行一个汇总

sklearn常用模块介绍

Scikit-learn(又称为sklearn)是一个流行的Python机器学习库,它提供了丰富的机器学习算法和工具,用于数据预处理、特征工程、模型选择、模型训练和评估等任务。下面是一些常用的sklearn模块介绍:

  • sklearn.datasets:提供了一些常用的数据集,如Iris、MNIST等,可以用于练习和测试模型。
  • sklearn.preprocessing:包含数据预处理和特征工程相关的功能,如数据标准化、缺失值处理、特征编码、特征选择等。
  • sklearn.feature_extraction:提供了从文本数据中提取特征的工具,如CountVectorizer、TfidfVectorizer等。
  • sklearn.model_selection:提供了交叉验证、超参数搜索、模型选择等功能来帮助优化模型的性能。
  • sklearn.linear_model:包含各种线性模型,如线性回归、逻辑回归、Lasso、Ridge等。
  • sklearn.tree:提供了决策树相关的功能,如决策树分类器、回归树、随机森林等。
  • sklearn.ensemble:包含集成学习方法,如随机森林、梯度提升树等。
  • sklearn.cluster:提供了聚类算法,如K均值聚类、层次聚类等。
  • sklearn.metrics:包含了各种模型评估指标,如准确率、精确率、召回率、F1值等。
  • sklearn.neural_network:提供了神经网络模型,如多层感知器(MLP)等。
  • sklearn.svm:包含支持向量机算法及其变体,如SVC、SVR等。
  • sklearn.naive_bayes:实现朴素贝叶斯算法,如高斯朴素贝叶斯、多项式朴素贝叶斯等。
  • sklearn.pipeline:提供了构建机器学习流水线的功能,将数据预处理、特征工程和模型训练等步骤组合起来。

一、sklearn数据预处理

1.1、无量纲化

StandardScaler和MinMaxScaler是scikit-learn(sklearn)库中常用的两种无量纲化(数据标准化)方法。它们对特征进行转换,使得数据落在特定的范围内,有助于提高模型的性能和稳定性。

# StandardScaler标准化通过去除均值并按标准差缩放特征,使得特征的均值为0,标准差为1。

from sklearn.preprocessing import StandardScaler
# 创建StandardScaler对象
scaler = StandardScaler()
# 用数据X来拟合scaler对象
scaler.fit(X)
# 对数据X进行标准化转换
X_scaled = scaler.transform(X)
#MinMaxScaler归一化通过将特征缩放到给定的范围(默认为[0, 1])内,进行线性变换。适用于数据分布有明显边界的情况。

from sklearn.preprocessing import MinMaxScaler
# 创建MinMaxScaler对象
scaler = MinMaxScaler()
# 用数据X来拟合scaler对象
scaler.fit(X)
# 对数据X进行归一化转换
X_scaled = scaler.transform(X)

下面列举通常情况下哪些会使用无量纲化技术:

  • 线性回归模型:无量纲化可以改善数值特征之间的尺度差异,使得线性回归模型更稳定。常见的无量纲化方法包括标准化(Standardization)和最小-最大缩放(MinMax Scaling)。

  • 逻辑回归模型:逻辑回归模型通常要求特征具有相似的数值范围,以确保模型收敛稳定。无量纲化可以帮助解决不同特征尺度差异的问题。

  • 支持向量机(SVM):SVM模型对于数据的尺度非常敏感,因此在训练SVM之前进行无量纲化是很重要的。通过将特征缩放到相似的范围,可以避免某些特征对模型的影响过大。

  • k-最近邻算法(KNN):KNN算法使用特征之间的距离度量来进行分类或回归,因此无量纲化可以确保不同特征的度量方式具有相似的尺度。这有助于避免某些特征对距离计算的影响过大。

  • 主成分分析(PCA):PCA是一种常用的降维技术,它将原始特征转换为一组新的无关特征(主成分)。在进行PCA之前,通常需要对特征进行无量纲化,以确保各个特征对主成分的权重能够准确反映其贡献度。

1.2、独热编码(ont-hot编码)

OneHotEncoder 是一个用于进行独热编码(One-Hot Encoding)的工具,将离散特征转换为二进制向量表示的编码方式。

独热编码是将离散特征转换为一种适用于机器学习算法的向量表示方法。对于具有 n 个不同取值的离散特征,独热编码将其转换为一个长度为 n 的二进制向量,其中只有一个元素为 1,表示当前观察值属于该取值,其他元素为 0。

OneHotEncoder 类的主要参数和方法如下:

参数:

  • categories:指定要编码的特征的取值范围。可以是 ‘auto’、‘auto’ ‘basic’、array-like 或者 ‘all’。默认为 ‘auto’,表示根据输入数据自动确定取值范围。
  • sparse:指定是否返回稀疏矩阵表示。默认为 True,返回稀疏矩阵;如果设置为 False,则返回密集矩阵表示。

方法:

  • fit(X):通过输入数据 X 来拟合编码器,学习特征的取值范围。
  • transform(X):对输入数据 X 进行独热编码转换。
  • fit_transform(X):组合了 fit 和 transform 的操作,同时拟合模型并对数据进行编码。
  • inverse_transform(X):将独热编码的数据转换回原始特征表示。
  • get_feature_names_out():获取输出编码特征的名称。
from sklearn.preprocessing import OneHotEncoder
import numpy as np

# 创建一个示例数据集
X = np.array([['男', '北京'],
              ['女', '上海'],
              ['男', '广州'],
              ['女', '北京']])

# 创建并拟合编码器
encoder = OneHotEncoder()
encoder.fit(X)

# 进行独热编码转换
encoded_X = encoder.transform(X)

# 输出独热编码后的结果
print(encoded_X.toarray())
[[1. 0. 1. 0. 0. 1.]
 [0. 1. 0. 1. 1. 0.]
 [1. 0. 0. 0. 0. 1.]
 [0. 1. 1. 0. 0. 1.]]

在这个例子中,我们拟合了一个 OneHotEncoder,并使用原始数据 X 进行独热编码。输出结果是一个稀疏矩阵,表示特征的独热编码表示。每一列代表一个特征值,其中只有对应观察值的特征值位置为 1,其他位置为 0。

注意,需要将分类变量存储在一个二维数组(或类似结构)中,并提供给 OneHotEncoder 的 fit 和 transform 方法。

1.3、标签编码

LabelEncoder,用于对标签或目标变量进行数字编码。LabelEncoder将分类变量的标签映射到整数

值,从而使得机器学习算法能够对这些分类变量进行处理。

from sklearn.preprocessing import LabelEncoder

# 创建LabelEncoder对象
label_encoder = LabelEncoder()

# 假设labels是包含分类变量标签的数组
labels = ["apple", "banana", "apple", "orange"]

# 拟合LabelEncoder并进行标签编码
label_encoder.fit(labels)

# 输出编码映射
print("编码映射:", label_encoder.classes_)

# 将标签数组转换为整数编码
encoded_labels = label_encoder.transform(labels)
print("编码后的标签:", encoded_labels)

# 可选:将整数编码转换回原始标签
original_labels = label_encoder.inverse_transform(encoded_labels)
print("原始标签:", original_labels)

二、sklearn特征工程

2.1、分割训练集和测试集

train_test_split是scikit-learn库(sklearn)中用于将数据集划分为训练集和测试集的函数。这个函数可以帮助我们在机器学习任务中有效地划分数据,以便进行模型的训练和评估。

from sklearn.model_selection import train_test_split
# 参数(特征值,目标值,测试集的比例默认为0.25,随机数种子)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

2.2、网格搜索

GridSearchCV类是用于执行参数网格搜索的工具。网格搜索是一种通过遍历给定参数组合来优化模型超参数的方法。

from sklearn.model_selection import GridSearchCV

# 参数选择
param_grid = {
    # 参数名:交叉使用参数的列表
    "": [],
    "": []
}

# estimator可以是已经训练完的初始化机器学习模型,例如随机森林等
grid_search = GridSearchCV(estimator, param_grid, cv=5)
grid_search.fit(X, y)
  • estimator是指定的机器学习模型。
  • param_grid是待搜索的超参数空间,以字典或列表形式提供。
  • cv是交叉验证的折数,默认为5。

GridSearchCV函数根据指定的参数网格(param_grid),在交叉验证的每个训练集上执行模型的训练和验证,并选择表现最好的超参数组合。它利用交叉验证避免了过拟合,并提供了针对不同超参数组合的模型性能评估。

通过GridSearchCV函数,我们可以系统地搜索最佳超参数组合,以获得最优的模型性能。一旦搜索完成,我们可以使用grid_search.best_params_来获取最佳超参数组合,并使用grid_search.best_score_来获取最佳性能得分。

2.3、特征提取

        特征提取(Feature Extraction)是将原始数据转换为一组可表示和描述数据特征的数值型表示的过程。在机器学习和模式识别领域,特征提取是非常重要的步骤,因为数据通常以复杂的形式出现,包含大量的不相关或冗余信息,而特征提取的目的是从原始数据中选择并提取最相关和有用的特征,以便于后续的机器学习模型或算法进行学习和处理。

        特征提取可以针对不同类型的数据进行,如文本数据、图像数据、音频数据等。对于文本数据,特征提取可以包括词袋模型、TF-IDF模型等方法,将文本转换为向量表示。对于图像数据,特征提取可以包括边缘检测、颜色直方图、纹理特征等方法。对于音频数据,特征提取可以包括MFCC(Mel-frequency cepstral coefficients)系数、音频频谱等方法。

        特征提取的质量和适用性对于机器学习任务的成功至关重要。合适的特征选择和提取可以帮助机器学习模型更好地理解数据,提高学习和预测的准确性和效率。因此,特征提取是机器学习中的一个关键步骤,需要结合领域知识和实践经验来设计和选择适合的特征提取方法。

2.3.1、字典特征提取

DictVectorizer用于将字典形式的数据集转换为特征矩阵。它接受一个字典数组作为输入,每个字典表示一个样本,其中字典的键是特征名,对应的值是该样本在该特征上的取值。DictVectorizer将每个特征名转换为特征的列,并将对应值填充到特征矩阵中。如果某个样本在某个特征上没有取值,则用0来填充。这种方式将非数值类型的特征转换为二进制的特征表示,适用于一些算法要求输入为数值型特征的情况。

from sklearn.feature_extraction import DictVectorizer

# 创建字典数组作为输入数据
data = [
    {'color': 'red', 'size': 'big'},
    {'color': 'blue', 'size': 'small'},
    {'color': 'green', 'size': 'medium'}
]

# 创建DictVectorizer对象
vectorizer = DictVectorizer(sparse=False)

# 转换数据集
X = vectorizer.fit_transform(data)

# 打印特征矩阵和特征名
print(X)
print(vectorizer.get_feature_names())

2.3.2、文本特征提取

CountVectorizer用于将文本数据集转换为词频特征矩阵。它将文本数据集中的每个文档看作一个样本,将文档拆分为单词(或称为词项),然后统计每个词项在每个文档中出现的次数。最终,生成一个特征矩阵,其中每一行表示一个文档,每一列表示一个词项,对应的值表示该词项在该文档中的出现次数。CountVectorizer可以通过设置参数来进行一些预处理操作,如去除停用词、进行词干提取等。它常用于文本分类、文本聚类等任务。

from sklearn.feature_extraction.text import CountVectorizer

# 创建文本数据集
corpus = [
    'I like cats',
    'I like dogs',
    'I like both cats and dogs'
]

# 创建CountVectorizer对象
vectorizer = CountVectorizer()

# 转换文本数据集为特征矩阵
X = vectorizer.fit_transform(corpus)

# 打印特征矩阵和特征名
print(X.toarray())
print(vectorizer.get_feature_names())

2.3.3、词频-逆文档频率

TfidfVectorizer也用于将文本数据集转换为特征矩阵,但它将文本转换为TF-IDF特征矩阵。TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本特征表示方法,它考虑了词频(TF)和逆文档频率(IDF)。TF指词项在文档中的出现频率,IDF指逆文档频率,用于衡量词项的重要性。TfidfVectorizer将文本数据集中的每个文档看作一个样本,对每个文档计算各个词项的TF-IDF值,并生成一个TF-IDF特征矩阵。与CountVectorizer相比,TfidfVectorizer更加倾向于考虑词项的重要性,可以在文本分类、信息检索等任务中发挥重要作用。

from sklearn.feature_extraction.text import TfidfVectorizer

# 创建文本数据集
corpus = [
    'I like cats',
    'I like dogs',
    'I like both cats and dogs'
]

# 创建TfidfVectorizer对象
vectorizer = TfidfVectorizer()

# 转换文本数据集为TF-IDF特征矩阵
X = vectorizer.fit_transform(corpus)

# 打印TF-IDF特征矩阵和特征名
print(X.toarray())
print(vectorizer.get_feature_names())

2.4、PCA降维

PCA代表主成分分析(Principal Component Analysis)。PCA是一种常用的降维技术,用于将高维数据转换为低维数据,同时保留数据中最重要的信息。

参数:

  • n_components:
    • ⼩数:表示保留百分之多少的信息
    • 整数:减少到多少特征

PCA类的主要目标是通过线性投影将原始特征空间映射到一个较低维度的特征子空间。映射后的特征子空间中的新特征称为主成分,是原始特征的线性组合。主成分的选择是通过最大化方差来保留尽可能多的原始数据信息。

PCA类的常用方法和属性包括:

  • fit(X):拟合PCA模型到数据X,计算主成分和数据变换所需的参数。
  • transform(X):将数据X转换到主成分空间,降低数据的维度。
  • fit_transform(X):一步完成拟合和转换操作,返回降维后的数据。
  • inverse_transform(X):将主成分空间的数据X映射回原始特征空间,还原维度。
  • explained_variance_:返回每个主成分解释的方差比例。
  • explained_variance_ratio_:返回每个主成分解释的方差比例的累积和。
  • components_:返回主成分的特征向量。

使用PCA可以实现降维,去除数据中的冗余信息,帮助更好地理解和可视化数据,同时减少计算复杂度和存储需求。通常,在应用前,需要选择合适的保留主成分的数量或设定一个解释方差的阈值,来满足特定的数据分析和模型需求。

from sklearn.decomposition import PCA

# 创建PCA对象,设定主成分数为2
pca = PCA(n_components=2)

# 假设X是输入数据,维度为(n_samples, n_features)
X = ...

# 拟合PCA模型并进行降维(转换)
X_transformed = pca.fit_transform(X)

# 查看解释的方差比例
explained_variance_ratio = pca.explained_variance_ratio_
print("解释方差比例:", explained_variance_ratio)

# 查看主成分的特征向量
components = pca.components_
print("特征向量:", components)

# 查看最终剩下的维度
print("剩下的维度", pca.n_components_)

通过explained_variance_ratio_属性,可以查看每个主成分解释的方差比例,该比例反映了每个主成分所包含的信息量。最后,可以通过components_属性获取主成分的特征向量,这些特征向量定义了主成分作为原始特征的线性组合。

三、sklearn机器学习模型

由于篇幅问题,放到下篇文章讲解

四、sklearn模型评估

4.1、均方误差

用于计算平均绝对误差(Mean Absolute Error,MAE)。MAE是回归问题中常用的性能评估指标之一,用于衡量预测值和观测值之间的平均绝对差异。它计算的是预测值与真实值之间的平均绝对误差,即预测值和真实值之间差的绝对值的平均值

from sklearn.metrics import mean_absolute_error

# 使用mean_absolute_error计算MAE
score = mean_absolute_error(y_true, y_pred) # 真实值,预测值

4.2、四P原则

  • 准确率(Accuracy):准确率是指模型在所有预测中正确预测的比例。准确率越高,表示模型的预测结果与真实标签的一致性越好。
  • 召回率(Recall):召回率是指在所有真实实例中,模型正确预测为正的比例。召回率衡量的是模型识别出的正例占所有真实正例的比例。高召回率意味着模型更能够捕获正例,但可能会有更多的误报。
  • 精确率(Precision):精确率是指在所有预测为正的实例中,模型预测正确的比例。精确率衡量的是模型预测为正的实例中的真正正例比例。高精确率意味着模型在预测为正时更可靠,但可能会错过一些真正的正例。
  • 支持率(Support):支持率表示在数据集中每个类别的样本数量。例如,训练集中属于类别 A 的样本数就是 A 类别的支持率。支持率可以用来对比不同类别之间的样本数量差异。

四个指标是评估分类模型性能常用的指标,主要用于衡量模型的预测能力和准确性

这些指标常用于评估各种分类模型,如逻辑回归、决策树、随机森林、支持向量机(SVM)等。它们提供了对模型在不同方面性能的全面评估,帮助了解模型的效果,并选择最合适的模型或调整模型的参数,以达到最佳性能。

from sklearn.metrics import accuracy_score # 准确率
from sklearn.metrics import recall_score   # 召回率
from sklearn.metrics import precision_score # 精确率

accuracy = accuracy_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)

支持率sklearn并没有一个单独的方法,但是我们可以通过classification_report:这个函数可以生成分类报告,其中包含每个类别的支持率。(还可以查看精确率,召回率,F1-score【精确率和召回率的调和平均数】)

from sklearn.metrics import classification_report

report = classification_report(y_true, y_pred)

print(report)

下图是使用classification_report输出的结果样例

4.3、roc_auc_score

roc_auc_score函数是scikit-learn库(sklearn)中用于计算分类模型的ROC曲线下的面积(AUC)的函数。ROC曲线(Receiver Operating Characteristic curve)是一种常用的评估二分类模型预测能力的工具,ROC曲线下的面积(AUC)是ROC曲线的数值化度量,用于比较和评估不同模型的性能。

from sklearn.metrics import roc_auc_score

roc_auc = roc_auc_score(y_true, y_score)

参数说明:

  • y_true是真实的标签(0或1)列表或数组。
  • y_score是模型对样本为正例的预测概率列表或数组。

该函数比较了不同概率阈值下的模型真正例率(True Positive Rate,TPR)和假正例率(False Positive Rate,FPR),并计算了ROC曲线下的面积(AUC)。ROC曲线下的面积范围从0到1,其中AUC等于0.5表示模型的预测能力不高于随机猜测,AUC接近1则表示模型的预测能力较好。

roc_auc_score函数适用于评估各种二分类模型,如逻辑回归、支持向量机(SVM)、随机森林等。通过计算AUC,我们可以对模型的整体性能进行评估,选择最佳的模型或调整模型的预测概率阈值,以提高模型的预测能力

4.4、评估聚类算法

4.4.1、卡林斯基-哈拉巴斯指数

calinski_harabasz_score是scikit-learn库(sklearn)中用于计算聚类模型的Calinski-Harabasz指数的函数。Calinski-Harabasz指数是一种用于评估聚类模型性能的指标,该指标基于聚类结果中簇内的紧密度和簇间的分离度。

from sklearn.metrics import calinski_harabasz_score

score = calinski_harabasz_score(X, labels)
  • X是数据样本的特征矩阵,每行代表一个样本,每列代表一个特征。
  • labels是聚类算法得到的样本标签,表示每个样本属于哪个簇。

calinski_harabasz_score函数通过计算簇内的平均距离和簇间的平均距离来计算Calinski-Harabasz指数。较高的Calinski-Harabasz指数表示簇内的样本更紧密,簇间的样本更分散,即更好的聚类结果。

该函数适用于评估聚类模型的性能,如K-means、层次聚类等。通过计算Calinski-Harabasz指数,我们可以比较不同聚类算法的性能,选择合适的簇数或评估聚类算法在数据集上的效果。

需要注意的是,calinski_harabasz_score函数的计算复杂度随着数据样本数量的增加而增加。因此,在处理大型数据集时,应谨慎使用该函数

4.4.2、轮廓系数法(Silhouette Coefficient)

轮廓系数是一种用于评估聚类模型中聚类质量和样本分离程度的指标。

目的:聚类内部距离最⼩化,外部距离最⼤化

from sklearn.metrics import silhouette_score

score = silhouette_score(X, labels)
  • X是数据样本的特征矩阵,每行代表一个样本,每列代表一个特征。
  • labels是聚类算法得到的样本标签,表示每个样本属于哪个簇。

silhouette_score函数通过计算每个样本的轮廓系数,并取所有样本的平均值来得到聚类模型的整体轮廓系数。轮廓系数的取值范围在[-1, 1]之间,数值越接近1表示样本聚类效果越好,数值越接近-1表示样本可能被错误地分配到了不正确的簇,数值接近0表示样本存在重叠或近邻簇存在相似度相近的情况。

轮廓系数考虑了簇内样本的紧密度和簇间样本的分离度,因此可以作为评估聚类模型性能的重要指标。较高的轮廓系数通常表示较好的聚类结果,可以帮助选择合适的聚类算法、确定最佳的簇数或评估不同聚类算法在数据集上的效果。

需要注意的是,轮廓系数不适用于密度聚类算法,因为密度聚类算法中的簇可能具有不同的形状和大小,无法满足轮廓系数的计算假设。因此,在使用silhouette_score函数计算轮廓系数之前,请确保选择的聚类算法适用于该指标

4.5、损失评估

log_loss 是一个用于计算对数损失(Logistic Loss)的函数。对数损失是用于评估分类模型预测概率的一种常见指标。它适用于二分类和多分类问题。

log_loss(y_true, y_pred, *, eps=1e-15, normalize=True, sample_weight=None, labels=None)

参数说明:

  • y_true:表示真实的目标标签,形状为 (n_samples, ) 或 (n_samples, n_classes)。
  • y_pred:表示模型预测的概率值,形状同 y_true
  • eps:极小值,用于防止计算中的除零错误,默认为 1e-15。
  • normalize:是否对结果进行归一化,默认为 True。如果为 True,则返回的是归一化的对数损失;如果为 False,则返回的是非归一化的对数损失。
  • sample_weight:样本权重,可选参数,默认为 None。如果提供了样本权重,则会根据权重对损失进行加权。
  • labels:标签列表,可选参数,默认为 None。用于指定每个类别的顺序。如果省略,则默认为按照出现顺序排序的唯一类别值。

函数的返回值是计算得到的对数损失值。

对数损失是用于评估模型预测概率的一种连续性损失度量,它越小表示模型的预测越准确。对于二分类问题,对数损失可以用来评估正类概率的预测结果;对于多分类问题,可以用来评估每个类别的概率预测结果。

例如,假设我们有一组真实的二分类标签 y_true 和对应的模型预测概率 y_pred,我们可以使用 log_loss 函数计算对数损失:

from sklearn.metrics import log_loss

y_true = [1, 0, 1, 1]
y_pred = [[0.9, 0.1], [0.4, 0.6], [0.7, 0.3], [0.8, 0.2]]

loss = log_loss(y_true, y_pred)
print(loss)
0.7135581778200728

 这里的对数损失值为 0.7135。请注意,y_true 和 y_pred 的形状需要匹配,例如,如果 y_true 是二分类问题的真实标签,那么 y_pred 的形状应为 (n_samples, 2)

如果报类似错

y_true and y_pred contain different number of classes 9, 2. Please provide the true labels explicitly through the labels argument. Classes found in y_true: [0 1 2 3 4 5 6 7 8]

那我们可以对y_true和y_pred进行one-hot编码 

感谢观看,希望文章对你有帮助

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值