首页 > 其他分享 >Scikit-learn (`sklearn`) 教程

Scikit-learn (`sklearn`) 教程

时间:2024-09-21 18:48:32浏览次数:3  
标签:模型 Scikit print train learn test import sklearn

Scikit-learn (sklearn) 教程

Scikit-learn 是 Python 中最流行的机器学习库之一,提供了丰富的机器学习算法、数据预处理工具以及模型评估方法,广泛应用于分类、回归、聚类和降维等任务。

在本教程中,我们将介绍如何使用 Scikit-learn 进行数据加载、特征处理、模型训练与评估,并展示一些常用的机器学习模型。

1. 安装 Scikit-learn

你可以使用以下命令安装 scikit-learn

pip install scikit-learn

2. Scikit-learn 的核心组件

  • 数据集:提供内置数据集和数据集加载工具。
  • 特征工程:包括特征缩放、编码、缺失值处理等。
  • 模型:提供分类、回归、聚类、降维等多种算法。
  • 模型评估:包括交叉验证、网格搜索等。

3. 数据集

Scikit-learn 提供了多种内置数据集(例如 IrisBoston),并且提供了用于加载外部数据集的工具。

3.1 加载内置数据集

例如,加载 Iris 数据集:

from sklearn.datasets import load_iris

# 加载 Iris 数据集
iris = load_iris()
print(iris.feature_names)  # 输出特征名称
print(iris.target_names)   # 输出目标类别名称

# 特征数据
X = iris.data
# 目标数据
y = iris.target

print(X.shape, y.shape)
3.2 使用 Pandas 加载 CSV 数据

你也可以使用 Pandas 加载本地 CSV 数据:

import pandas as pd

# 加载 CSV 数据
data = pd.read_csv('data.csv')

# 分离特征和目标
X = data.drop('target_column', axis=1)
y = data['target_column']

4. 数据预处理

Scikit-learn 提供了一些常用的特征预处理工具,例如标准化、归一化、标签编码等。

4.1 标准化与归一化
  • 标准化:将数据转换为均值为 0,方差为 1 的正态分布。
  • 归一化:将数据缩放到 [0, 1] 或 [-1, 1] 的范围。
from sklearn.preprocessing import StandardScaler, MinMaxScaler

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 归一化
min_max_scaler = MinMaxScaler()
X_normalized = min_max_scaler.fit_transform(X)
4.2 标签编码

将分类标签转换为数字编码:

from sklearn.preprocessing import LabelEncoder

# 标签编码
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y)

5. 训练/测试集拆分

在进行模型训练前,通常需要将数据集划分为训练集和测试集。Scikit-learn 提供了 train_test_split 函数来完成这一操作。

from sklearn.model_selection import train_test_split

# 划分训练集和测试集,比例为 80:20
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print(X_train.shape, X_test.shape)

6. 模型训练

Scikit-learn 提供了丰富的机器学习算法。常见的分类、回归和聚类算法都可以通过 fit() 方法来训练模型。

6.1 分类任务示例:K 最近邻 (KNN)

K 最近邻算法是一种经典的分类算法。以下是使用 KNN 进行分类的示例:

from sklearn.neighbors import KNeighborsClassifier

# 创建 KNN 模型
knn = KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = knn.predict(X_test)
6.2 回归任务示例:线性回归

对于回归任务,可以使用线性回归模型进行训练:

from sklearn.linear_model import LinearRegression

# 创建线性回归模型
lr = LinearRegression()

# 训练模型
lr.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = lr.predict(X_test)

7. 模型评估

Scikit-learn 提供了多种评估指标,用于衡量模型的性能。

7.1 分类模型评估
  • 准确率:分类模型中常用的评估指标,表示预测正确的样本占总样本的比例。
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')

# 分类报告
print(classification_report(y_test, y_pred))

# 混淆矩阵
print(confusion_matrix(y_test, y_pred))
7.2 回归模型评估
  • 均方误差:常用的回归模型评估指标,衡量预测值与真实值的差距。
from sklearn.metrics import mean_squared_error, r2_score

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse}')

# R^2 分数
r2 = r2_score(y_test, y_pred)
print(f'R^2 Score: {r2}')

8. 交叉验证

交叉验证是一种常用的模型评估方法,可以更稳健地评估模型性能。Scikit-learn 提供了 cross_val_score 来实现交叉验证。

from sklearn.model_selection import cross_val_score

# 使用交叉验证评估模型性能,使用 5 折交叉验证
scores = cross_val_score(knn, X, y, cv=5)
print(f'Cross-validation scores: {scores}')
print(f'Average score: {scores.mean()}')

9. 模型调参

在实际应用中,找到最优的超参数组合非常重要。Scikit-learn 提供了 GridSearchCVRandomizedSearchCV 来进行超参数调优。

9.1 网格搜索(Grid Search)
from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'n_neighbors': [3, 5, 7],
    'weights': ['uniform', 'distance']
}

# 进行网格搜索
grid_search = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 输出最佳参数
print(f'Best parameters: {grid_search.best_params_}')
9.2 随机搜索(Randomized Search)
from sklearn.model_selection import RandomizedSearchCV

# 定义随机搜索参数
param_distributions = {
    'n_neighbors': [3, 5, 7],
    'weights': ['uniform', 'distance']
}

# 随机搜索
random_search = RandomizedSearchCV(KNeighborsClassifier(), param_distributions, cv=5, n_iter=10)
random_search.fit(X_train, y_train)

# 输出最佳参数
print(f'Best parameters: {random_search.best_params_}')

10. 管道 (Pipeline)

Pipelinescikit-learn 中的一个非常有用的工具,它将多个步骤组合在一起,形成一个工作流。通过 Pipeline,我们可以将数据预处理和模型训练整合为一个过程,方便进行交叉验证和超参数调优。

10.1 创建管道
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

# 创建一个包含标准化和 SVM 分类器的管道
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # 数据标准化
    ('svc', SVC())                 # 支持向量机分类器
])

# 使用管道进行训练和预测
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)

# 评估模型
print(f'Accuracy: {accuracy_score(y_test, y_pred)}')
10.2 在管道中使用网格搜索

你可以在 Pipeline 中使用超参数调优,调整管道中的每个步骤的参数。

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'svc__C': [0.1, 1, 10],
    'svc__kernel': ['linear', 'rbf']
}

# 使用管道进行网格搜索
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 输出最佳参数
print(f'Best parameters: {grid_search.best_params_}')

# 使用最佳模型进行预测
best_pipeline = grid_search.best_estimator_
y_pred = best_pipeline.predict(X_test)

# 评估结果
print(f'Accuracy: {accuracy_score(y_test, y_pred)}')

11. 特征选择

在机器学习中,特征选择是非常重要的一步。通过去除无用或冗余的特征,可以提升模型的性能。scikit-learn 提供了多种特征选择的方法。

11.1 使用 SelectKBest 进行特征选择

SelectKBest 是一种常见的特征选择方法,它根据某种评分标准(如 f_classif)选择前 K 个最重要的特征。

from sklearn.feature_selection import SelectKBest, f_classif

# 使用 SelectKBest 选择前 2 个最重要的特征
selector = SelectKBest(f_classif, k=2)
X_new = selector.fit_transform(X_train, y_train)

# 打印被选择的特征
print(X_new.shape)
11.2 在管道中使用特征选择

你可以将特征选择步骤集成到 Pipeline 中,以便与其他步骤(如标准化和模型训练)一起进行处理。

from sklearn.feature_selection import SelectKBest
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline

# 创建一个包含特征选择、标准化和 SVM 分类器的管道
pipeline = Pipeline([
    ('select', SelectKBest(f_classif, k=2)),  # 特征选择
    ('scaler', StandardScaler()),             # 标准化
    ('svc', SVC())                            # 支持向量机
])

# 训练模型
pipeline.fit(X_train, y_train)

# 预测结果
y_pred = pipeline.predict(X_test)
print(f'Accuracy: {accuracy_score(y_test, y_pred)}')

12. 聚类

scikit-learn 提供了多种聚类算法。聚类是无监督学习中的一种任务,目标是将数据划分为多个组(簇),其中同一簇的对象相似度较高。

12.1 K-means 聚类

K-means 是一种经典的聚类算法,它通过最小化簇内的方差将数据划分为 K 个簇。

from sklearn.cluster import KMeans

# 创建 K-means 模型,指定 3 个簇
kmeans = KMeans(n_clusters=3, random_state=42)

# 训练模型
kmeans.fit(X)

# 预测簇标签
y_kmeans = kmeans.predict(X)

# 打印每个样本所属的簇
print(y_kmeans)
12.2 层次聚类 (Agglomerative Clustering)

层次聚类通过不断合并最近的簇来构建层次树结构。你可以指定合并停止的簇数量。

from sklearn.cluster import AgglomerativeClustering

# 创建层次聚类模型
agg_clustering = AgglomerativeClustering(n_clusters=3)

# 训练模型
y_agg = agg_clustering.fit_predict(X)

# 打印簇标签
print(y_agg)

13. 降维

降维技术用于将高维数据映射到低维空间,减少维度,同时尽可能保留原始数据的信息量。常见的降维方法有主成分分析(PCA)和线性判别分析(LDA)。

13.1 PCA 降维

主成分分析(PCA)是一种线性降维技术,找到数据的主要方向,最大限度地保留数据的方差。

from sklearn.decomposition import PCA

# 创建 PCA 模型,指定主成分数量为 2
pca = PCA(n_components=2)

# 使用 PCA 进行降维
X_pca = pca.fit_transform(X)

# 打印降维后的数据形状
print(X_pca.shape)
13.2 LDA 降维

线性判别分析(LDA)是一种监督学习的降维方法,通常用于分类任务。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

# 创建 LDA 模型
lda = LDA(n_components=2)

# 使用 LDA 进行降维
X_lda = lda.fit_transform(X, y)

# 打印降维后的数据形状
print(X_lda.shape)

14. 模型持久化

在完成模型训练后,你可以使用 joblibpickle 将模型保存为文件,之后可以加载该模型进行预测,而无需重新训练。

14.1 保存模型
import joblib

# 保存模型到文件
joblib.dump(knn, 'knn_model.pkl')
14.2 加载模型
# 从文件中加载模型
loaded_model = joblib.load('knn_model.pkl')

# 使用加载的模型进行预测
y_pred = loaded_model.predict(X_test)
print(f'Accuracy: {accuracy_score(y_test, y_pred)}')

15. 自定义估计器

除了使用 scikit-learn 提供的标准模型外,你还可以通过继承 BaseEstimatorClassifierMixin 自定义自己的估计器。

from sklearn.base import BaseEstimator, ClassifierMixin
import numpy as np

class CustomClassifier(BaseEstimator, ClassifierMixin):
    def __init__(self, threshold=0.5):
        self.threshold = threshold

    def fit(self, X, y):
        self.mean_ = np.mean(X, axis=0)
        return self

    def predict(self, X):
        return (np.mean(X, axis=1) > self.threshold).astype(int)

# 创建并使用自定义分类器
clf = CustomClassifier(threshold=0.6)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(f'Accuracy: {accuracy_score(y_test, y_pred)}')

16. 完整示例:分类任务

下面是一个完整的例子,展示了如何加载数据、进行预处理、构建管道、训练模型、进行网格搜索、评估模型性能,并将模型保存。

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
from sklearn.pipeline import Pipeline
import joblib

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 构建管道
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # 标准化
    ('knn', KNeighborsClassifier())  # KNN 分类器
])

# 定义参数网格
param_grid = {
    'knn__n_neighbors': [3, 5, 7],
    'knn__weights': ['uniform', 'distance']
}

# 网格搜索
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(X

_train, y_train)

# 最佳模型
print(f'Best parameters: {grid_search.best_params_}')

# 在测试集上进行预测
y_pred = grid_search.predict(X_test)

# 评估模型
print(f'Accuracy: {accuracy_score(y_test, y_pred)}')
print(classification_report(y_test, y_pred))

# 保存最佳模型
joblib.dump(grid_search.best_estimator_, 'best_knn_model.pkl')

17. 总结

通过本教程,你已经了解了 Scikit-learn 的主要功能和使用方法,包括数据预处理、模型训练与评估、超参数调优、管道、特征选择、聚类、降维等。Scikit-learn 提供了强大且易用的 API,适合从简单的机器学习任务到更复杂的工作流构建。

标签:模型,Scikit,print,train,learn,test,import,sklearn
From: https://blog.csdn.net/jixiaoyu0209/article/details/142353940

相关文章

  • Federated Learning Challenges, Methods, and Future Directions
    本文讨论了联邦学习的独特特征和挑战,提供了当前方法的广泛概述,并概述了与广泛的研究社区相关的未来工作的几个方向。背景:现代分布式网络中的设备(如移动电话、可穿戴设备和自动驾驶汽车等)每天会产生大量数据,由于这些设备的计算能力不断增强,以及对传输私人信息的担忧,在本地......
  • 基于Q-learning算法和ε-greedy策略解决随机生成的方形迷宫问题(Matlab代码实现)
     ......
  • 机器学习之Python中Scikit-Learn(sklearn)入门
    文章目录机器学习之Python中Scikit-Learn(sklearn)入门一、引言二、安装与导入1、安装2、导入库三、LinearRegression线性回归1、算法简介2、模型创建与训练2.1、创建模型2.2、数据准备2.3、划分数据集2.4、模型训练3、模型评估4、模型使用四、总结机器学习之Python......
  • 论文阅读:Unsupervised Representation Learning with Deep Convolutional Generative
    Abstract背景:希望能缩小CNN在监督学习和无监督学习之间成功应用的差距。贡献:引入了一类称为深度卷积生成对抗网络(DCGAN)的CNN。结果:DCGAN在生成器和判别器中都能从对象到场景学习表示层次结构。1.Introduction贡献:提出DCGAN用于图像分类任务,展示其性能对滤波器......
  • Go to Learn Go之命令行参数
    概述在上一节的内容中,我们介绍了Go的时间日期,包括:time包、格式化日期、日期字符串解析、计算日期差、时区操作、定时任务等。在本节中,我们将介绍Go的命令行参数。命令行参数在程序设计中扮演着重要的角色,它允许用户在运行程序时提供自定义的输入,以控制程序的行为。Go语言提供了灵活......
  • Imitating Language via Scalable Inverse Reinforcement Learning
    本文是LLM系列文章,针对《ImitatingLanguageviaScalableInverseReinforcementLearning》的翻译。通过可扩展的逆向强化学习模仿语言摘要1引言2方法3实验4相关工作5讨论6结论摘要大多数语言模型训练都建立在模仿学习的基础上。它涵盖了预训练、监......
  • Go to Learn Go之时间日期
    概述在上一节的内容中,我们介绍了Go的Gob,包括:Gob简介、Gob编码、Gob解码等。在本节中,我们将介绍Go的时间日期。Go语言提供了一套强大的时间日期处理库,使得处理时间和日期变得简单和高效。Go语言中处理日期和时间的常用方式是使用time包,这个包提供了许多用于日期和时间操作的功能,包括......
  • 【mechine learning-十-梯度下降-学习率】
    学习率学习率不同的学习率在梯度下降算法中,学习率的选择很重要,不恰当的选择,甚至可能导致损失发散,而非收敛,下面就看一下学习率的影响。学习率学习率是下图中的红框圈出来的部分,学习率是模型的超参数,输入模型用来更新权重,那么它的大小意味着什么呢?不同的学习率......
  • Zero-Shot,One-Shot,Few-Shot,In-Context Learning
    Zero-Shot,One-Shot,Few-Shot,In-ContextLearninghttps://blog.csdn.net/weixin_44212848/article/details/139902394In-ContextLearning定义:In-contextlearning是一种在不显式微调模型权重的情况下,通过给模型提供相关的上下文信息(例如提示或样本)来实现模型性能提升的方法。GPT......
  • FVFL: A Flexible and Verifiable Privacy-Preserving Federated Learning Scheme--FV
    FVFL:AFlexibleandVerifiablePrivacy-PreservingFederatedLearningScheme--FVFL:一种灵活且可验证的隐私保护联邦学习方案来源导读AbstractIntroductionProblemStatementA.ProblemDefinitionB.ThreatModelandGoalsPreliminariesA.FederatedLearning(......