Python 课程20-Scikit-learn

news2024/12/23 19:44:14

前言

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 StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
  •  归一化:将特征值缩放到 [0, 1] 范围。
from sklearn.preprocessing import MinMaxScaler

scaler = 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 OneHotEncoder

encoder = OneHotEncoder(sparse=False)
X_encoded = encoder.fit_transform(X)
数据拆分与交叉验证

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

from sklearn.model_selection import train_test_split

X_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 DecisionTreeClassifier

model = DecisionTreeClassifier()
model.fit(X_train, y_train)
  •  随机森林
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier()
model.fit(X_train, y_train)

4. 无监督学习

K-means 聚类

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

from sklearn.cluster import KMeans

model = KMeans(n_clusters=3)
model.fit(X)
labels = model.predict(X)
主成分分析(PCA)

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

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
DBSCAN 聚类

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

from sklearn.cluster import DBSCAN

model = 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_score

scores = cross_val_score(model, X, y, cv=5)
print("Cross-validation scores:", scores)

网格搜索与随机搜索

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

  • 网格搜索
from sklearn.model_selection import GridSearchCV

param_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 uniform

param_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 SVC

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('svc', SVC())
])

pipeline.fit(X_train, y_train)
predictions = pipeline.predict(X_test)
  •  在管道中进行参数调优
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("最佳参数:", 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, ClassifierMixin

class MyCustomModel(BaseEstimator, ClassifierMixin):
    def __init__(self, param=1):
        self.param = param

    def fit(self, X, y):
        # 自定义训练逻辑
        return self

    def 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.coloradmin.cn/o/2167817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为何专利对企业创新与竞争至关重要?

在当今这个技术飞速发展的时代,每一个创新的火花都可能成为推动行业进步的关键力量。然而,创新并非一蹴而就,它需要时间、资金与智慧的共同投入,更需要一套完善的保护机制来确保其成果不被轻易窃取或模仿。这一重任,便…

WebPage-Bootstrap框架(container类,container-fluid类,栅格系统)

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器,框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

医院排班|医护人员排班系统|基于springboot医护人员排班系统设计与实现(源码+数据库+文档)

医护人员排班系统目录 目录 基于springboot医护人员排班系统设计与实现 一、前言 二、系统功能设计 三、系统实现 医护类型管理 排班类型管理 科室信息管理 医院信息管理 医护信息管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示: 五、核心代码…

“AI+Security”系列第3期(五):AI技术在网络安全领域的本地化应用与挑战

近日,由安全极客、Wisemodel 社区、InForSec 网络安全研究国际学术论坛和海升集团联合主办的“AI Security”系列第 3 期技术沙龙:“AI 安全智能体,重塑安全团队工作范式”活动顺利举行。此次活动吸引了线上线下超过千名观众参与。 在活动中…

shell中对xargs命令传参进行编辑

以文件解压为例,将当前路径下的所有gz文件解压到同名的log文件中,解压命令如下所示: ls *.gz| xargs -n 1 -P 4 -I {} bash -c zcat "{}" > $(echo "{}" | sed "s/gz$/log/g") 执行结果如下图所示&#x…

mamba-yolo模型的深度学习环境配置

本文将介绍如何配置目标检测模型mamba-yolo的深度学习环境 1. 环境要求 Python > 3.9 (本文使用python-3.11) CUDA > 11.6 (本文使用CUDA-11.8) Pytorch > 1.12.1 (本文使用torch-2.4.0) Linu…

【C++】STL标准模板库容器——set

🦄个人主页:修修修也 🎏所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 📌关联式容器set(集合)简介 📌set(集合)的使用 🎏set(集合)的模板参数列表 🎏set(集合)的构造函数 🎏set(集合)的迭代…

JavaScript异步编程:async、await的使用

async 和 await 是在 ECMAScript 2017 (ES7) 中引入的特性,用于处理异步操作。它们允许你以一种更加简洁和同步的方式来编写异步代码。 async 函数表示它会返回一个 Promise,而 await 关键字用于等待一个 Promise 解决。 关于 promise 的详细介绍&#…

蜂窝物联网全网通sim卡切网技术方案软硬件实现教程(设备根据基站信号质量自动切网)

01 物联网系统中为什么要使用三合一卡 三合一卡为用户解决了单一运营商网络无法全覆盖的缺陷,避免再次采购的经济成本以及时间成本和因没有信号设备停止工作造成的损失,保证仅需一次采购并提高设备工作效率和入网活跃度。例如下面地区的设备&#xff0…

Spring Web MVC课后作业

目录 1.加法计算器 2.⽤户登录 3.留⾔板 1.加法计算器 (1)需求分析 加法计算器功能, 对两个整数进⾏相加, 需要客⼾端提供参与计算的两个数, 服务端返回这两个整数计算 的结果。 (2)接⼝定义 请求路径: calc/sum 请…

Java框架学习(mybatis)(01)

简介:以本片记录在尚硅谷学习ssm-mybatis时遇到的小知识 详情移步:想参考的朋友建议全部打开相互配合学习! 官方文档: MyBatis中文网https://mybatis.net.cn/index.html 学习视频: 067-mybatis-介绍和对比_哔哩哔…

Linux本地服务器搭建开源监控服务Uptime Kuma与远程监控实战教程

文章目录 前言**主要功能**一、前期准备本教程环境为:Centos7,可以跑Docker的系统都可以使用本教程安装。本教程使用Docker部署服务,如何安装Docker详见: 二、Docker部署Uptime Kuma三、实现公网查看网站监控四、使用固定公网地址…

docker - maven 插件自动构建镜像(构建镜像:ebuy-docker:v2.0)

文章目录 1、docker服务端开启远程访问2、在pom.xml文件plugins下添加Maven的docker插件3、编写dockerfile文件4、执行maven的打包命令5、查看 镜像 ebuy-docker:v2.06、创建 容器 ebuy-dockerv2.0 上面手动构建镜像的过程比较繁琐,使用Maven的docker插件可以实现镜…

MySQL数据库进阶知识(五)《锁》

学习目标: 一周掌握数据库锁相关知识 学习内容: 一. 概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共…

Word2vec的应用

目录 1.分词 2.模型训练 3.可视化 4.知识点个人理解 pip install gensim -i https://pypi.tuna.tsinghua.edu.cn/simple #若在jupyter notebook中安装: ! pip install gensim -i https://pypi.tuna.tsinghua.edu.cn/simple #导包 import jieba import re import…

一种能够一机两用的源代码保密方案

在数字化时代,企业面临的数据泄露风险日益增加,保护机密数据的安全成为了一项重要任务。SDC沙盒技术作为一种先进的数据保密解决方案,通过创新的沙盒概念,在防泄密领域展现了其独特的价值和作用。 一、SDC沙盒技术简介 SDC沙盒技…

使用ucharts写的小程序页面柱状图上方没有数字

使用uCharts官网 - 秋云uCharts跨平台图表库写的柱状图如何让柱子上放没有数据 更改前 更改后 使用uCharts官网 - 秋云uCharts跨平台图表库 写的小程序图表,无论是柱状图还是折线图添加一个 dataLabel: false, // 不显示数据 九可以实现不显示数据 const opts …

必看!道路运输企业主要负责人和安全生产管理人员考核新动向

必看!道路运输企业主要负责人和安全生产管理人员考核新动向 道路运输企业两类人员#叙后尘 道路运输企业主要负责人和安全生产管理人员报考 交通运输主管部门具体组织实施本行政区域内道路运输企业主要负责人和安全生产管理人员安全考核有关工作,并在…

无网络entos7报错ImportError: /lib64/libm.so.6: version `GLIBC_2.27‘ not found更新glibc

最近在尝试使用sklearn的升级版cuml,因为是一台没有连接互联网的gpu机器,所以构建cuml环境过程很坎坷,需要各种将各种whl包在线下载后上传到服务器中。 当我终于解决完包的互相依赖问题后,在import cuml时候遇到一个错误&#xff…

【线程】线程池

线程池通过一个线程安全的阻塞任务队列加上一个或一个以上的线程实现,线程池中的线程可以从阻塞队列中获取任务进行任务处理,当线程都处于繁忙状态时可以将任务加入阻塞队列中,等到其它的线程空闲后进行处理。 线程池作用: 1.降…