掌握 Scikit-Learn: Python 中的机器学习库入门

news/2024/4/28 21:25:20/文章来源:https://blog.csdn.net/weixin_46274168/article/details/133847852

机器学习 第二课 Sklearn 入门

  • 概述
  • 机器学习与 Python 的完美结合
  • Scikit-Learn 的核心组件与结构
    • 安装与配置
    • 验证安装
  • 数据表示与预处理
    • 特征矩阵和目标向量
    • 数据处理
  • 估计器
  • 模型的选择
    • 思考问题的本质
    • 研究数据的分布
    • 判断任务的复杂性
    • 分类问题
    • 回归问题
  • 监督学习
    • 分类算法
    • 回归算法
  • 无监督学习
  • 模型的评估
    • 训练集和验证集
    • 分类模型评估
    • 回归模型评估
  • 特征工程
    • 特征选择
    • 特征提取

概述

机器学习 (Machine Learning) 是一个近年来频繁出现在科技新闻, 研究报告, 行业分析和实际应用中的热门领域. 机器学习 (Machine Learning) 正以前所未有的速度影响着我们的生活. 从智能音响的语音识别, 手机摄像头的人脸解锁, 到金融领域的评估, 医疗健康的预测分析. 机器学习的应用早已渗透到生活的方方面面. 对于我们这些初学着来说, Scikit-Learn 是最好的选择.

掌握 Scikit-Learn

Scikit-Learn, 简称 Sklearn, 是 Python 的一个开源机器学习库, 自从诞生以来, 已经逐渐成为机器学习领域的标准库. Sklearn 提供了丰富的算法选择, 从基础的线性回归 (Linear Regression), 分类, 到高级的集成方法和模型优化, 几乎涵盖了机器学习的各个方面. 但更为重要的是, Scikit-Learn 的设计哲学为使用者提供了简答, 高效, 可靠的工具, 帮助我们来完成自己的任务.

今天小白我带大家来全面了解一下 Scikit-Learn 的基础, 从安装配置开始, 探讨其核心组件, 估计器, 模型训练与评估, 再到实际应用案例, 我们将逐步探索这个强大的库. 希望在文章的结尾, 读者可以具备食用 Scikit-Learn 解决实际问题的能力.

机器学习与 Python 的完美结合

我们先来探讨一个问题: 为什么要选择 Python 作为机器学习的编程语言? 这个问题的答案可以从多个角度来看. 首先, Python 是一种通用的高级编程语言, 语法简洁明了, 适合初学着学习. 此外, Python 有着丰富的开源库和框架, 涵盖了从数据分析, 可视化到深度学习的各个方面, 这使得 Python 在数据科学和机器学习领域占据了显著的优势.

其次, Python 的社区活跃, 有着大量的在线资源, 教程和案例, 这为我们提供了宝贵的学习资料. 不仅如此, Python 的跨平台特性使得开发者可以在不同的操作系统上轻松的部署和运行自己的程序.

那么, 为何选择 Scikit-Learn 作为 Python 中的机器学习库? 与其他库相比, Scikit-Learn 有着明确的优势. 首先, 它的 API 设计统一, 清晰, 无论是数据预处理, 模型训练还是评估, 用户都可以用几行简短的代码完成. 此外 Scikit-Learn 的文档齐全, 为我们提供了大量的实例和指导, 大大降低了学习的难度. 最后, Scikit-Learn 是一个纯 Python 实现的库, 意味着我们无语安装大量复杂的以来或担心其他库的兼容性问题.

Scikit-Learn 的核心组件与结构

安装与配置

Scikit-Learn 依赖于 Numpy 和 SciPy, 两个为 Python 提供科学计算功能的库. 因此, 在安装 Scikit-Learn, 去报已经安装了这两个库.

安装 Scikit-Learn:

pip install scikit-learn

conda:

conda install scikit-learn

验证安装

查看是否安装成功:

import sklearnprint(sklearn.__version__)

数据表示与预处理

在 Scikit-Learn 中, 数据同城为 Numpy 数组或特征矩阵. 其中样本是矩阵的行, 特征是矩阵的列.

特征矩阵和目标向量

特征矩阵:

  • 通常表示为 “X”, 形状为 “[n_samples, n_features”
    目标向量
  • 当处理监督学习问题时, 我们还会有一个不妙 (或标签) 数组, 通常表示为 ‘y’

数据处理

Scikit-Learn 提供了多种实用工具, 帮助我们对数据进行预处理:

  • 缩放: 如 “StandardScaler”, 帮助我们对数据进行标准化
  • 编码: 如 “OneHotEncoder”, 将分类特征转换为数字
  • 填充: 使用 “SimpleImputer”, 处理缺失数据

估计器

Scikit-Learn 的估计器 (Estimator) 为不同的机器学习应用提供了一致的界面.

核心概念如下:

  • 估计器 (Estimator): 所有算法的实现都是估计器, 例如, 线性回归是一个估计器, k 近邻也是一个估计器
  • 转换器 (Transformer): 可以对数据进行某种转化的估计器
  • 预测期 (Predictor): 可以根据输入数据进行预测的估计器

基本步骤包括:

  1. 选择一个模型, 导入相应的估计器类
  2. 选择模型参数, 实例化类, 设置超参数值
  3. 整理数据, 通过特征矩阵和目标向量组织
  4. 调用估计器的fit()方法训练模型
  5. 使用predict()方法进行预测

例子:

"""
@Module Name: Scikit-Learn 估计器.py
@Author: CSDN@我是小白呀
@Date: October 15, 2023Description:
Scikit-Learn 估计器
"""
from sklearn.linear_model import LinearRegression# 创建数据
X = [[1], [2], [3]]
y = [2, 4, 6]# 实例化模型
model = LinearRegression()# 训练模型
model.fit(X, y)# 预测
predict = model.predict([[4]])
print("预测结果:", predict)

输出结果:

预测结果: [8.]

模型的选择

在机器学习中, 模型的选择是最关键的步骤之一. 一个恰当的模型可以大大提高预测的准确性, 而不合适的模型可能导致预测结果严重偏离我们想要的结果.

所以, 在选择模型之前, 我们要先明确我们要解决的问题, 机器学习的问题主要分为两大类, 分类问题 (Classification) 和回归问题 (Regression).

思考问题的本质

在选择模型之前, 我们先要明确问题的本质. 有些问题可能乍看是分类问题, 但实际上使用回归模型更为合适. 例如: 预测学生期末考试及格率可以视为一个分类问题 (及格 / 不及格), 但其实我们使用回归模型来预测分数能得到更好的效果.

研究数据的分布

数据分布 (Data Distribution) 和特征 (Feature) 对模型的选择也至关重要, 不同的模型对不同的数据表现也不一样. 举个例子, 对于分布不平衡的分类数据 (某些类数据量远大于别的类), 我们需要通上采样 (Up-Sampling) 或下采样 (Sub-Sampling) 来处理不平衡的数据类型.

判断任务的复杂性

问题的复杂性也是一个需要考虑的重要因素. 简单的线性模型, 如线性回归或逻辑回归, 可能适用于线性可分的问题. 但对于更复杂, 非线性的问题, 可能需要使用决策树 (Decision Tree), 随机森林 (Random Forest) 等复杂模型.

线性 (Linear) vs 非线性 (Non-Linear):

  • 线性 (Linear):
    • 线性关系是指两个或多个变量 (Variable) 之间的关系为线性关系
    • 线性关系在数学中可以以 y = w x + b y=wx + b y=wx+b 其中 w 为权重 (Weight), b 为偏差 (Bias)
    • 在线性系统中, 输入和输出的关系是成比例的
  • 非线性 (Non-Linear):
    • 非线性是指变量之间的关系为非线性, 比如曲线
    • 非线性方程包括, 多项式, 指数, 对数
    • 在非线性系统, 输入和输出之间的关系是复杂的

分类问题

分类问题 (Classification) 指的是预测的输出变量为类别, 例如判断一个电影的类型, 物体是猫还是狗.

分类问题的机器学习模型有:

  • 线性模型: 逻辑回归 (Logistic Regression)
  • 非线性模型: k-近邻 (KNN), 决策树 (Decision Tree), 支持向量机 (SVM)

回归问题

回归问题 (Regression) 是指预测的输出变量是连续的值, 例如票房预测, 房价预测等等.

回归问题的机器学习模型有:

  • 线性模型: 线性回归 (Linear Regression)
  • 非线性模型: 决策树回归 (Decision Tree Regressor), 随机森林 (Random Forest)

监督学习

监督学习 (Supervised Learning) 是机器学习的一个核心分支, 目标是从带标签 (Label) 的数据中学习一个模型, 并预测未知数据的标签.

分类算法

逻辑回归 (Logistic Regression): 尽管名称中有 “回归”, 但是逻辑回归模型是一个分类模型, 主要用于二分类 (Binary Classification) 问题. 逻辑回归通过 Sigmoid 函数, 输出一个概率值, 从而为输入样本分类.

例子:

from sklearn.linear_model import LogisticRegressionclf = LogisticRegression()
clf.fit(X_train, y_train)

决策树 (Decision Tree): 图像话的算法, 易于理解和解释, 可以用于分类和回归任务.

例子:

from sklearn.tree import DecisionTreeClassifiertree = DecisionTreeClassifier()
tree.fit(X_train, y_train)

回归算法

线性回归 (Linear Regression): 在数据中找到最佳拟合直线. 预测一个连续的输出.

例子:

from sklearn.linear_model import LinearRegressionreg = LinearRegression()
reg.fit(X_train, y_train)

支持向量回归 (SVR, Support Vector Regression): 使用支持向量机来执行回归.

例子:

from sklearn.svm import SVRsvr = SVR()
svr.fit(X_train, y_train)

无监督学习

无监督学习 (Unsupervised Learning) 与监督学习不同, 无监督学习是从未标签的数据中寻找模式.

K-均值 (K-Means): 将数据划分为 k 个集群.

例子:

from sklearn.cluster import KMeanskmeans = KMeans(n_clusters=3)
kmeans.fit(X)

主成分分析 (PCA): 减少数据的维数, 同时尝试保留尽可能多的信息.

例子:

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

网络搜索 (Grid Search): 系统地遍历各种参数组合, 通过交叉验证确定最小效果参数.

例子:

from sklearn.model_selection import GridSearchCVparam_grid = {'C': [0.1, 1, 10], 'gamma': [1, 0.1, 0.01]}
grid = GridSearchCV(SVR(), param_grid, refit=True)
grid.fit(X_train, y_train)

随机搜索 (Randomized Search): 与 Grid Search 类似, 但不尝试所有参数, 二手随机抽样给定数量的参数组合.

模型的评估

在机器学习的过程中, 选择合适的模型至关重要. 同样, 评估模型的性能才能了解模型是否达到了我们的预期, 以避免欠拟合和过拟合问题.

训练集和验证集

为了评估模型的效果, 我们需要有一个基准. 所以我们需要分割训练集和测试集. 训练集用于训练模型 (Train), 留出一部分数据用于测试模型, 也就是验证集 (Valid), 而不是将所有的数据训练模型.

分类模型评估

混淆矩阵 (Confusion Matrix): 表现模型的真实值与预测值之间的关系, 包括真正例, 负正例, 假整例, 和假负例.

例子:

from sklearn.metrics import confusion_matrixy_pred = clf.predict(X_test)
matrix = confusion_matrix(y_test, y_pred)
print(matrix)

准确率 (Accuracy), 召回率 (Recall), F1 (F1-score): 评估分类器的不同方面, 包括其准确性, 覆盖范围和平衡性.

例子:

from sklearn.metrics import classification_reportreport = classification_report(y_test, y_pred)
print(report)

回归模型评估

均方误差 (MSE, Mean Square Error): 衡量模型预测的准确性.

例子:

from sklearn.metrics import mean_squared_errormse = mean_squared_error(y_test, y_pred)
print(mse)

R^2 分数 (R-squared Score): 衡量模型解释变量的能力, 值越接近 1 越好.

例子:

from sklearn.metrics import r2_scorer2 = r2_score(y_test, y_pred)
print(r2)

交叉验证 (Cross-Validation) 将数据分为多个子集, 然后对每个子集进行多次的训练 / 测试分割. 例如, 常见的 k-折叠 (k-Fold) 交叉验证方法会将数据分为 k 个子集. 在每次的验证中, 其中一个子集被用作验证集, 其他的子集则被用作训练集. 这样我们就能得到 k 个不同的模型性能评估, 这些评估的平均值可以提供更准确的模型性能评估.

例子:

"""
@Module Name: 模型的评估.py
@Author: CSDN@我是小白呀
@Date: October 16, 2023Description:
模型的评估
"""
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, recall_score, f1_score# 加载 iris 数据集
data = load_iris()
X = data.data
y = data.target# 实例化随机森林
clf = RandomForestClassifier(n_estimators=50, random_state=42)# 分割训练集 & 验证集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 使用 KFold 进行5折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(clf, X, y, cv=kf)
print("交叉验证平均得分:", scores.mean())# 训练模型
clf.fit(X_train, y_train)# 评估指标
y_pred = clf.predict(X_test)
print("精度:", accuracy_score(y_test, y_pred))
print("召回率:", recall_score(y_test, y_pred, average='macro'))  # 多分类问题使用宏平均
print("F1分数:", f1_score(y_test, y_pred, average='macro'))  # 多分类问题使用宏平均

输出结果:

交叉验证平均得分: 0.9600000000000002
精度: 1.0
召回率: 1.0
F1分数: 1.0

特征工程

特征工程 (Feature Engineering) 是机器学习中的关键步骤. 我们通过创建和选择合适的特征, 模型的性能可以得到大幅提升.

特征选择

特征选择 (Feature Selection) 是选择与目标变量相关的特征的过程, 同时剔除不相关或冗余的特征.

特征选择的好处有:

  1. 减少模型的复杂性
  2. 降低过拟合的风险
  3. 提高模型训练速度

举个例子:
假设我们有一个预测房价的数据集, 其中包含了很多特征,如房间数, 地理位置, 建筑年份, 是否靠近地铁站等. 但是, 其中可能还包含了一些不太相关的特征, 如房东的姓名, 是否有游泳池等. 通过特征选择, 我们可以只选择与房价最相关的特征来训练模型.

代码:

"""
@Module Name: 特征选择.py
@Author: CSDN@我是小白呀
@Date: October 16, 2023Description:
通过波士顿房价数据集, 说明特征选择
"""
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.feature_selection import SelectKBest, f_regression# 使用 Boston 房价数据集作为示例
data = load_boston()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['PRICE'] = data.target# 假设我们增加了一些不相关的特征
df['LANDLORD_NAME'] = np.random.choice(['Alice', 'Bob', 'Charlie'], df.shape[0])
df['HAS_POOL'] = np.random.choice([0, 1], df.shape[0])# 将分类特征转化为数字
df['LANDLORD_NAME'] = df['LANDLORD_NAME'].astype('category').cat.codes# 分割数据
X = df.drop('PRICE', axis=1)
y = df['PRICE']# 使用 SelectKBest 进行特征选择
# 为了确定与房价最相关的特征, 我们可以使用f _regression 作为评分函数
selector = SelectKBest(score_func=f_regression, k=2)
X_new = selector.fit_transform(X, y)# 打印被选中的特征
selected_features = pd.DataFrame(selector.inverse_transform(X_new),columns=X.columns)
selected_columns = selected_features.columns[selected_features.var() != 0]
print('选择的特征:', selected_columns)

输出结果:

选择的特征: Index(['RM', 'LSTAT'], dtype='object')

特征提取

特征提取 (Feature Extraction) 是将原始数据转换为一组代表性的, 较少的特征. 与特征选择不同, 特征提取创建成新的特征. 主要成分分析 (PCA) 是一种常用特征提取方法.

例子:

"""
@Module Name: 特征提取.py
@Author: CSDN@我是小白呀
@Date: October 16, 2023Description:
人脸识别数据集, 说明特征提取
"""
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt# 加载人脸数据集
lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
X = lfw_people.data
n_samples, n_features = X.shape# 原始图像的维度
h, w = lfw_people.images.shape[1:3]# PCA 转换, 提取 150 个主要成分
n_components = 150
pca = PCA(n_components=n_components, whiten=True).fit(X)
X_pca = pca.transform(X)# 可视化主要成分的效果
def plot_gallery(images, titles, h, w, n_row=5, n_col=5):plt.figure(figsize=(1.8 * n_col, 2.4 * n_row))plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.35)for i in range(n_row * n_col):plt.subplot(n_row, n_col, i + 1)plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray)plt.title(titles[i], size=12)plt.xticks(())plt.yticks(())eigenfaces = pca.components_.reshape((n_components, h, w))
eigenface_titles = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
plot_gallery(eigenfaces, eigenface_titles, h, w)# 绘图
plt.show()

输出结果:
PCA

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

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

相关文章

Spring Cloud Alibaba—Sentinel 控制台安装

1、Sentinel 控制台包含如下功能: 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最…

并发数计算方法

1、性能测试计算TPS 性能测试的TPS,大都是根据用户真实的业务数据(运营数据)来计算的 普通计算方式:TPS=总请求数/总时间 二八原则计算方法:TPS=总请求*0.8/总时间*0.2 (二八原则就是指80%的请求在20%的时间内完成) 总结:普通计算方式只能满足基本的要求,但是不能很好覆…

【Leetcode】 96. 不同的二叉搜索树

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n 3 输出:5 示例 2: 输入:n 1 输出&#xff1a…

甘特图:如何制定一个有效的项目计划?需要考虑这些方面

一个清晰、可行的计划能够为团队提供明确的方向,确保项目顺利执行,缺乏明确的计划可能导致项目偏离轨道。 甘特图是一种通过条状图形来表示项目和进度的工具,由于其具有视觉化的优点,使得管理者能够更容易地掌握项目进展情况。因…

快速傅里叶变换FFT在MATLAB中的实现

一、FFT的由来 首先,为什么要进行傅里叶变换?将时域的信号变换到频域的正弦信号,正弦比原信号更简单,且正弦函数很早就被充分地研究,处理正弦信号比处理原信号更简单。正弦信号的频率保持性:输入为正弦信号…

电力物联网关智能通讯管理机-安科瑞黄安南

众所周知,网关应用于各种行业的终端设备的数据采集与数据分析,然后去实现设备的监测、控制、计算,为系统与设备之间建立通讯联系,达到双向的数据通讯。 网关可以实时监测并及时发现异常数据,同时自身根据用户规则进行…

微信小程序引入阿里巴巴iconfont图标并使用

介绍 在小程序里,使用阿里巴巴的图标,如下所示: 使用方式 搜索自己需要的图标,然后将需要用到的图标加入购物车,如下图所示: 去右上角,点击购物车按钮;这里第一次使用,会有三个提…

图纸管理制度、技术部图纸管理制度

图纸管理制度 1、技术部必须做图纸领用及归还记录,到期未还者,根据记录及时追收 2、技术部根据管理部每天公布的缺勤公告,确定领图者的合法性,并对其负责 3、图纸损坏或丢失的,追究相关责任人的绩效分数,…

软件测试定位bug方法+定位案例(详解)

1、问题bug定位技巧 首先,作为开发也好,测试也好,定位问题有一个总的思路,而这个思路是和数据的走向一致的。 大致是这样: 用户层面问题 -> Web页面/软件界面 -> 中间件 -> 后端服务 -> 代码 -> 数据…

SpringBoot整合阿里云OSS、天翼云OSS、MinIO对象存储

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 以下是正文! 对象存储是什么&#xff1f…

idea禁用双击ctrl

Run anything | IntelliJ IDEA Documentation Disable double modifier key shortcuts

Adaptive Homogeneity-DirectedDemosaicing Algorithm

Abstract 经济高效的数码相机使用单图像传感器,将红色、绿色和蓝色滤色镜的交替图案应用到每个像素位置。通过估计每个颜色平面中缺失的像素分量来重建彩色图像的完整三色表示的方法称为去马赛克算法。本文提出了通常与结合二维 (2-D) 方向插值的去马赛克算法相关的…

密码管理的艺术:数据库存储密码的策略、技术和工具

最近接手公司一个之前的服务,竟然发现用户密码是明文存储在数据库中! 说实话还是有点吃惊的,这可不兴学 CSDN 呀,至少也得搞个 MD5 存一存吧。 不过 MD5 其实也没啥用,今天我们就来盘盘密码这种敏感信息该如何存储。…

Goland Cannot use ‘err‘ (type error) as the type any

问题描述: 用Goland写代码的时候,使用panic总是报错,官方用法也是报错,最后找到官方回复的链接,https://youtrack.jetbrains.com/issue/GO-12179/Cannot-use-err-type-error-as-the-type-any 问题解决方式&#xff1…

便利店小程序可以做哪些营销活动呢

在当今这个数字化时代,微信小程序已经成为了人们日常生活的一部分。对于便利店来说,拥有一个优秀的小程序不仅可以提高销售,还可以扩大品牌影响力,增加客户粘性。本文将探讨便利店小程序可以做什么样的营销活动,如何利…

Redis 排障:你永远不知道告警和下班,谁先到来?

01 第一个重点,服务排障的基本方法 在岁月静好的一天,正当笔者准备下班工作的时候,突然,告警出现了! 嗯,又是一到下班就会告警! 仔细一看,原来是数据整体处理时间的慢了。 既然慢了…

2023年全球新能源云母材料市场发展展望分析:储能云母市场规模快速增长[图]

云母作为电气设备的基础材料,下游应用领域涉及高温冶炼、电力等传统行业,并在近几年逐步扩展到新能源汽车、电化学储能等新兴行业。2022年,全球云母材料市场规模保持稳定增长至180.0亿元,期间年复合增长率约为13.2%。预计未来&…

【Hello Algorithm】暴力递归到动态规划(三)

暴力递归到动态规划(三) 最长公共子序列递归版本动态规划 最长回文串子序列方法一方法二递归版本动态规划 象棋问题递归版本动态规划 咖啡机问题递归版本动态规划 最长公共子序列 这是leetcode上的一道原题 题目连接如下 最长公共子序列 题目描述如下…

NodeMCU ESP8266 基于Arduino IDE的串口图形化调试教程(超详细)

NodeMCU ESP8266 基于Arduino IDE的串口图形化调试教程 文章目录 NodeMCU ESP8266 基于Arduino IDE的串口图形化调试教程前言Serial Plotter测试前期准备打开工具方法 1方法 2 测试代码 总结 前言 在嵌入式的开发过程中,我们经常会采集一些传感器的数据&#xff0c…

iCloud涨价不用慌!学会使用群晖生态将本地SSD“上云”

文章目录 前言本教程解决的问题是:按照本教程方法操作后,达到的效果是想使用群晖生态软件,就必须要在服务端安装群晖系统,具体如何安装群晖虚拟机请参考: 1. 安装并配置synology drive1.1 安装群辉drive套件1.2 在局域…