Python 课程20-Scikit-learn

前言

Scikit-learn 是 Python 中最流行的机器学习库之一,它提供了多种用于监督学习和无监督学习的算法。Scikit-learn 的特点是简单易用、模块化且具有高效的性能。无论是初学者还是专业开发者,都可以借助它进行快速原型设计和模型开发。

在本教程中,我们将深入讲解 Scikit-learn 的基础操作、数据预处理、模型构建与调优、以及常用的机器学习算法,包括线性回归、决策树、支持向量机、聚类等。通过这份详细教程,你将掌握如何使用 Scikit-learn 构建高效的机器学习模型。


目录

前言

目录

1. Scikit-learn 基础

安装 Scikit-learn

Scikit-learn API 概述

数据集导入与基本操作

2. 数据预处理

数据标准化与归一化

处理缺失数据

类别特征编码

数据拆分与交叉验证

3. 监督学习

线性回归

逻辑回归

支持向量机(SVM)

决策树与随机森林

4. 无监督学习

K-means 聚类

主成分分析(PCA)

DBSCAN 聚类

5. 模型评估与调优

模型评估指标

交叉验证

网格搜索与随机搜索

6. 高级功能

管道(Pipeline)机制

自定义评分函数与模型

示例:使用 Scikit-learn 进行鸢尾花分类

步骤 1:加载数据集

步骤 2:数据预处理

步骤 4:评估模型

步骤 5:交叉验证与网格搜索调优

步骤 6:使用最佳模型进行预测

结论


1. Scikit-learn 基础

安装 Scikit-learn

使用 pip 安装 Scikit-learn:

pip install scikit-learn

Scikit-learn 依赖于 NumPySciPymatplotlib,确保这些库已经安装。

Scikit-learn API 概述

Scikit-learn 的核心是统一的 API 设计,包括三个主要步骤:

  1. 模型初始化:实例化模型。
  2. 模型拟合:使用 .fit() 方法训练模型。
  3. 预测与评估:通过 .predict() 进行预测,使用评估函数进行性能评估。
from sklearn.linear_model import LinearRegression# 初始化模型
model = LinearRegression()# 拟合模型
model.fit(X_train, y_train)# 进行预测
predictions = model.predict(X_test)
数据集导入与基本操作

Scikit-learn 提供了一些内置的数据集,如 IrisBoston HousingDigits,你可以轻松导入并使用这些数据集。

  • 加载内置数据集
from sklearn import datasets# 加载 Iris 数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target

还可以通过 Pandas 读取 CSV 文件等外部数据集:

import pandas as pd# 从 CSV 文件读取数据
df = pd.read_csv('data.csv')
X = df.drop(columns=['target'])
y = df['target']

2. 数据预处理

在机器学习中,数据预处理是至关重要的步骤。Scikit-learn 提供了多种工具来处理缺失值、标准化数据和编码类别特征。

数据标准化与归一化

机器学习模型通常要求输入数据进行标准化或归一化,以确保所有特征具有相同的尺度。

  • 标准化:通过移除平均值并缩放到单位方差。
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
  •  归一化:将特征值缩放到 [0, 1] 范围。
from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X)
处理缺失数据

你可以使用 SimpleImputer 处理数据中的缺失值。

from sklearn.impute import SimpleImputer# 用均值填充缺失值
imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)
类别特征编码

对于类别型特征,OneHotEncoderLabelEncoder 是常用的工具。

  • OneHotEncoder:将类别特征编码为多个二进制列。
from sklearn.preprocessing import OneHotEncoderencoder = OneHotEncoder(sparse=False)
X_encoded = encoder.fit_transform(X)
数据拆分与交叉验证

在训练模型前,你需要将数据集拆分为训练集和测试集,以便评估模型的泛化能力。

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

3. 监督学习

线性回归

线性回归 是最基础的回归算法之一,用于预测连续值。

from sklearn.linear_model import LinearRegression# 创建线性回归模型
model = LinearRegression()# 拟合模型
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)
逻辑回归

逻辑回归 用于二分类或多分类任务。

from sklearn.linear_model import LogisticRegression# 创建逻辑回归模型
model = LogisticRegression()# 拟合模型
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)
支持向量机(SVM)

支持向量机可以用于分类、回归和异常检测任务。

from sklearn.svm import SVC# 创建支持向量机模型
model = SVC(kernel='linear')# 拟合模型
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)
决策树与随机森林

决策树 是一种简单但强大的模型,随机森林 是基于多个决策树的集成模型。

  • 决策树
from sklearn.tree import DecisionTreeClassifiermodel = DecisionTreeClassifier()
model.fit(X_train, y_train)
  •  随机森林
from sklearn.ensemble import RandomForestClassifiermodel = RandomForestClassifier()
model.fit(X_train, y_train)

4. 无监督学习

K-means 聚类

K-means 是一种常见的聚类算法,用于将数据划分为 K 个簇。

from sklearn.cluster import KMeansmodel = KMeans(n_clusters=3)
model.fit(X)
labels = model.predict(X)
主成分分析(PCA)

主成分分析 是一种降维技术,用于减少数据的特征维度,同时保留数据的主要信息。

from sklearn.decomposition import PCApca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
DBSCAN 聚类

DBSCAN 是一种基于密度的聚类算法,能够处理噪声和形状不规则的簇。

from sklearn.cluster import DBSCANmodel = DBSCAN(eps=0.5, min_samples=5)
labels = model.fit_predict(X)

5. 模型评估与调优

模型评估指标
  • 分类任务常用指标:准确率、精确率、召回率、F1 分数。
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score# 准确率
accuracy = accuracy_score(y_test, y_pred)# 精确率、召回率、F1 分数
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
  •  回归任务常用指标:均方误差、平均绝对误差、R² 分数。
from sklearn.metrics import mean_squared_error, r2_score# 均方误差和 R² 分数
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
交叉验证

交叉验证可以帮助你评估模型在不同数据划分下的性能。

from sklearn.model_selection import cross_val_scorescores = cross_val_score(model, X, y, cv=5)
print("Cross-validation scores:", scores)

网格搜索与随机搜索

通过 GridSearchCVRandomizedSearchCV 可以自动化地进行超参数调优。

  • 网格搜索
from sklearn.model_selection import GridSearchCVparam_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
model = SVC()
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X_train, y_train)print("最佳参数:", grid_search.best_params_)
print("最佳得分:", grid_search.best_score_)

在上述示例中,GridSearchCV 会尝试不同的参数组合,通过交叉验证选择性能最好的模型。

  • 随机搜索
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniformparam_dist = {'C': uniform(0.1, 10), 'kernel': ['linear', 'rbf']}
model = SVC()
random_search = RandomizedSearchCV(model, param_distributions=param_dist, n_iter=10, cv=5, random_state=42)
random_search.fit(X_train, y_train)print("最佳参数:", random_search.best_params_)
print("最佳得分:", random_search.best_score_)

RandomizedSearchCV 在参数空间较大时效率更高,因为它只随机采样参数组合。


6. 高级功能

管道(Pipeline)机制

Pipeline 机制允许将数据预处理和模型训练步骤串联起来,简化工作流程并避免数据泄漏。

  • 创建管道
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVCpipeline = Pipeline([('scaler', StandardScaler()),('svc', SVC())
])pipeline.fit(X_train, y_train)
predictions = pipeline.predict(X_test)
  •  在管道中进行参数调优
from sklearn.model_selection import GridSearchCVparam_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("最佳参数:", grid_search.best_params_)

在参数网格中,使用 步骤名称__参数名 的形式指定参数。

自定义评分函数与模型
  • 自定义评分函数

你可以定义自己的评分函数,用于模型评估和选择。

from sklearn.metrics import make_scorer, fbeta_score# 定义自定义评分函数
fbeta_scorer = make_scorer(fbeta_score, beta=0.5)# 在 GridSearchCV 中使用自定义评分函数
grid_search = GridSearchCV(model, param_grid, scoring=fbeta_scorer, cv=5)
  • 自定义模型

如果 Scikit-learn 没有满足你需求的模型,你可以创建自定义模型,只要遵循 fitpredict 方法的接口。

from sklearn.base import BaseEstimator, ClassifierMixinclass MyCustomModel(BaseEstimator, ClassifierMixin):def __init__(self, param=1):self.param = paramdef fit(self, X, y):# 自定义训练逻辑return selfdef predict(self, X):# 自定义预测逻辑return predictions

示例:使用 Scikit-learn 进行鸢尾花分类

我们将使用 Scikit-learn 的 Iris 数据集 进行分类任务。鸢尾花数据集包含 150 个样本,有 4 个特征和 3 个类别,目标是根据花瓣和萼片的大小来预测花的类别。

步骤 1:加载数据集
from sklearn import datasets
from sklearn.model_selection import train_test_split# 加载 Iris 数据集
iris = datasets.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)
步骤 2:数据预处理

我们将对特征进行标准化处理,使每个特征的均值为 0,方差为 1。

from sklearn.preprocessing import StandardScaler# 标准化处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

 步骤 3:训练分类模型(逻辑回归)

from sklearn.linear_model import LogisticRegression# 创建逻辑回归模型
model = LogisticRegression()# 训练模型
model.fit(X_train, y_train)
步骤 4:评估模型

我们使用准确率(Accuracy)评估模型在测试集上的性能。

from sklearn.metrics import accuracy_score# 预测测试集
y_pred = model.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集上的准确率: {accuracy:.2f}")
步骤 5:交叉验证与网格搜索调优

使用交叉验证评估模型,并使用 GridSearchCV 进行超参数调优。

from sklearn.model_selection import GridSearchCV# 定义参数网格
param_grid = {'C': [0.1, 1, 10],'solver': ['lbfgs', 'liblinear']
}# 使用 GridSearchCV 进行超参数调优
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train, y_train)# 输出最佳参数和最佳分数
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.2f}")
步骤 6:使用最佳模型进行预测

使用调优后的最佳模型对测试集进行预测,并计算新的准确率。

# 使用最佳模型进行预测
best_model = grid_search.best_estimator_
y_pred_best = best_model.predict(X_test)# 计算准确率
accuracy_best = accuracy_score(y_test, y_pred_best)
print(f"使用最佳模型的测试集准确率: {accuracy_best:.2f}")

 完整代码总结

from sklearn import datasets
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score# 加载数据集
iris = datasets.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)# 数据预处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 创建并训练模型
model = LogisticRegression()
model.fit(X_train, y_train)# 评估模型
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集上的准确率: {accuracy:.2f}")# 交叉验证与调优
param_grid = {'C': [0.1, 1, 10], 'solver': ['lbfgs', 'liblinear']}
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train, y_train)print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.2f}")# 使用最佳模型进行预测
best_model = grid_search.best_estimator_
y_pred_best = best_model.predict(X_test)
accuracy_best = accuracy_score(y_test, y_pred_best)
print(f"使用最佳模型的测试集准确率: {accuracy_best:.2f}")

结论

        通过本教程,你已经全面了解了 Scikit-learn 的基本使用方法和高级功能。从数据预处理、模型构建、模型评估到模型调优,Scikit-learn 提供了一套完整的机器学习解决方案。它的统一 API 设计使得各个算法之间的切换和比较变得非常容易。无论你是机器学习的新手还是经验丰富的开发者,Scikit-learn 都是一个不可或缺的工具,帮助你高效地构建和部署机器学习模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/436372.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

栈与队列相关知识(二)

目录 Java中栈(Stack) 一. 常用方法 1.push(E item) 2.pop() 3.peek() 4.empty() 二. 常用方法扩展 1. search(Object o) 2. clone() 3. contains(Object o) 4. size() 5. toArray() Java中队列(Queue) 一.常用方法&…

android compose ScrollableTabRow indicator 指示器设置宽度

.requiredWidth(30.dp) Box(modifier Modifier.background(Color.LightGray).fillMaxWidth()) {ScrollableTabRow(selectedTabIndex selectedTabIndex, // 默认选中第一个标签containerColor ColorPageBg,edgePadding 1.dp, // 内容与边缘的距离indicator { tabPositions…

《OpenCV 计算机视觉》—— 图像拼接

还未写完!!! 下面是两张需要拼接的图片 完整代码: import cv2 import numpy as np import sysdef cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)def detectAndDescribe(image):gray cv2.cvtColor(image, cv2.COLOR_…

C#测试调用Ghostscript.NET浏览PDF文件

Ghostscript.NET是针对Ghostscript的C#封装库,支持解析PostScript语言、操作PDF文件等。使用Ghostscript.NET的GhostscriptViewer 模块可以以图片形式查看PDF文档。本文学习并测试调用Ghostscript.NET模块打开及浏览PDF文件的基本用法。   Ghostscript.NET目前主要…

线性模型到神经网络

🚀 在初始神经网络那一节(链接如下:初始神经网络)的最后,我们通过加大考虑的天数使得我们最后得到的模型Loss最终停留在了0.32k,当我们在想让模型更加准确的时候,是做不到的,因为我们…

网站建设中常见的网站后台开发语言有哪几种,各自优缺点都是什么?

市场上常见的网站后台开发语言有PHP、Python、JavaScript、Ruby、Java和.NET等。这些语言各有其独特的优缺点,适用于不同的开发场景和需求。以下是对这些语言的具体介绍: PHP 优点:PHP是一种广泛用于Web开发的动态脚本语言,特别适…

python UNIT 3 选择与循环(2)

目录 1。循环的优化 经典优化分析: 未优化的代码: 细节分析: 优化后的代码: 优化的细节: 性能对比 优化的关键在于: 经典习题讲解:(紫色的解析请重点关注一下) 1。例三 个人代码解析…

Go实现RabbitMQ消息模式

【目标】 go实现RabbitMQ简单模式和work工作模式 go实现RabbitMQ 消息持久化和手动应答 go实现RabbitMQ 发布订阅模式 go使用MQ实现评论后排行榜更新 1. go实现简单模式 编写路由实现生产消息 实现生产消息 MQ消息执行为命令行执行,所以创建命令行执行函数mai…

机器学习-KNN分类算法

1.1 KNN分类 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法。它是概念极其简单,而效果又很优秀的分类算法。1967年由Cover T和Hart P提出。 KNN分类算法的核心思想:如果一个样本在特征空间中的k个最…

聊一聊 C#中有趣的 SourceGenerator生成器

一:背景 1. 讲故事 前些天在看 AOT的时候关注了下 源生成器,挺有意思的一个东西,今天写一篇文章简单的分享下。 二:源生成器探究之旅 1. 源生成器是什么 简单来说,源生成器是Roslyn编译器给程序员开的一道口子&am…

【架构】NewSQL

文章目录 NewSQLTiDBTiDB 主要组件特点使用场景安装与部署 推荐阅读 NewSQL NewSQL是一种数据库管理系统(DBMS)的类别,它结合了NoSQL数据库的可扩展性和传统SQL数据库的事务一致性。具体来说,NewSQL数据库旨在解决传统关系型数据库在处理大规模并发事务…

我是如何将 Java 基础 docker 镜像大小从 674Mb 优化到 58Mb的

我是如何将 Java 基础 docker 镜像大小从 674Mb 优化到 58Mb的 如果您是 Java 开发人员,并且正在使用 Docker 打包应用程序,您可能已经注意到,即使是“hello world”类型的项目,最终镜像的大小也可能非常大。在本文中&#xff0c…

D18【python接口自动化学习】-python基础之内置数据类型

day18 综合练习:实现手机通讯录(下) 学习日期:20240925 学习目标:内置数据类型--27 小试牛刀:如何使用类型转换实现手机通讯录(下) 学习笔记: 实现手机通讯录 案例文…

【C语言】字符和字符串函数(2)

文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr的使用和模拟实现五、strtok函数的使用六、strerr函数的使用 一、strncpy函数的使用 我们之前学习的strcpy的作用是把源字符串拷贝到目标空间内,而且经过我们的模拟实现&#x…

【Linux:线程概念】

目录 概念: 创建线程的函数:​编辑 ​编辑 有多进程为什么还需要有多线程? 线程调度的成本为什么低? 进程与线程的区别: 概念: 线程是CPU的基本调度单位,在进程内部运行。在内核中&#xff…

数据库系统

数据库管理系统 DBMS Database Management System分为三类: 关系数据库系统(Relation Database System) 面向对象数据库系统 (Object-Oriented Database System) 对象关系数据库系统 (Object-Oriented Relation Database System) 数据库设…

Stable Diffusion绘画 | SDXL模型使用注意事项

注意事项 SDXL模型的使用,对电脑配置要求更高,需要 8GB 以上显存的显卡SDXL模型兼容性不太好,容易出现错误,对 Mac 电脑不友好只能选择 SDXL模型 训练的 LoRA 使用不能使用旧的 VAE文件 SDXL 专用 VAE 文件:sdxl_vae.…

在矩池云使用 Llama-3.2-11B-Vision 详细指南

Llama 3.2-Vision是Meta开发的一系列多模态大型语言模型(LLMs),包含11B和90B两种规模的预训练和指令调整模型。 这些模型专门优化用于视觉识别、图像推理、字幕生成和回答有关图像的一般问题。Llama 3.2-Vision模型在常见行业基准测试中的表…

【网络安全】内部应用中的多重漏洞利用

未经许可,不得转载。 文章目录 初步发现:帐户枚举利用帐户枚举发现 IDOR 导致帐户接管拦截请求洪水攻击:注册拒绝服务目标网站:https://redacted.com 初步发现:帐户枚举 在最近的一次渗透测试中,我对一个仅供员工使用的内部应用程序进行了评估,重点关注身份验证和帐户…

HR告诉你:HCIE证书到底是职场神话还是锦上添花?真相大解析

在职场内卷的赛道上,每个人都在寻找能让自己脱颖而出的光环。而HCIE证书,作为IT领域的一项高含金量认证,莫过于优势最高最让人垂涎的光环,许多人相信它能开启通往理想职位的大门。 但在这个快速变化的时代,HCIE证书真的…