机器学习入门案例-鸢尾花

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 机器学习入门案例-鸢尾花

机器学习入门案例-鸢尾花


简介:本文讲解一个机器学习里面的经典案例,鸢尾花,鸢尾花案例是指一种虚构的情景,假设我们在一片花园里寻找鸢尾花。这种花的特点是两种颜色的花瓣呈现出鸢尾的形状,即黑白相间,如阴阳符号一般。我们的目标是通过花瓣的形状和颜色来识别这种特殊的花朵。


首先需要在jupyter中安装对应的环境。

pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install sklearn -i https://pypi.tuna.tsinghua.edu.cn/simple


数学公式


假设函数(Hypothesis Function):


逻辑回归的假设函数使用sigmoid函数将线性函数的输出转换为0到1之间的概率值:

image.png

其中,( z ) 是输入特征的线性组合,即:

image.png

损失函数(Loss Function):


我们使用对数似然损失函数(log-likelihood loss function)来衡量模型预测与真实标签之间的差距:

image.png

其中,hθ( x ) 是假设函数,y是真实标签,m 是样本数量。


参数更新:


我们使用梯度下降法来最小化损失函数,更新参数 θ

image.png

其中,α 是学习率。


Sigmoid函数:


Sigmoid函数用于将线性函数的输出映射到0到1之间的概率值,其数学公式如下:

image.png

实现代码


  1. Sigmoid 函数:Sigmoid 函数用于将线性模型的输出转换为概率值,其公式如下:

image.png

  1. 这里 ( z ) 是线性模型的输出,是输入特征的加权和加上偏置项。
  2. 逻辑回归模型的线性模型:在逻辑回归模型中,线性模型的表达式为:

image.png

其中,w0是偏置项,w1 , w2 , … , wn 是特征的权重参数,X1,X2,…,Xn 是输入特征。

最大似然估计(Maximum Likelihood Estimation,MLE):最大似然估计是用来估计模型参数的方法之一,在这个代码中,通过最大似然估计来求解逻辑回归模型的参数。最大似然估计的目标是最大化观测数据的联合概率密度函数,这里是最大化观测数据的概率,即使得观测数据出现的概率最大。


线性代数运算:代码中使用了一些线性代数运算,如矩阵的转置(X.T)、矩阵的乘法(X @ Y)、矩阵的逆(np.linalg.inv())等。

import numpy as np
import matplotlib.pyplot as plt


# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data[:, :2], (iris.target == 0).astype(int)  # 我们只使用两个特征和两个类别

# 绘制鸢尾花数据集分布图
plt.figure(figsize=(10, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], label='Setosa (类别 0)', color='red', edgecolors='k')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], label='Non-Setosa (类别 1)', color='blue', edgecolors='k')

# 横轴(X轴):花萼长度(单位:厘米)。花萼是鸢尾花的一个部分,位于花朵的底部,通常是一朵花的最外层。花萼长度是从花朵的底部到顶部的最长距离,以厘米为单位进行测量。
# 纵轴(Y轴):花萼宽度(单位:厘米)。花萼宽度是花萼在最宽处的宽度,以厘米为单位进行测量。
plt.xlabel('花萼长度 (cm)')
plt.ylabel('花萼宽度 (cm)')
plt.title('鸢尾花数据集分布图')
plt.legend()
plt.grid(True)
plt.show()


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

# 简单的逻辑回归实现
class LogisticRegression:
    def __init__(self):
        self.weights = None

    # Sigmoid函数
    def sigmoid(self, z):
        return 1 / (1 + np.exp(-z))

    # 拟合(训练)逻辑回归模型
    def fit(self, X, y):
        num_samples, num_features = X.shape
        self.weights = np.zeros(num_features + 1)  # 初始化参数为0,加1是因为需要加上偏置项
        X = np.hstack((np.ones((num_samples, 1)), X))  # 加入偏置项,即全部置为1

        # 使用最大似然估计求解参数(此处没有使用梯度下降,而是直接求解参数)
        self.weights = np.linalg.inv(X.T @ X) @ X.T @ y

    # 预测新样本的类别
    def predict(self, X):
        num_samples = X.shape[0]
        X = np.hstack((np.ones((num_samples, 1)), X))  # 加入偏置项

        # 计算线性模型的输出,并将其通过Sigmoid函数转换为概率
        linear_model = X @ self.weights
        y_predicted = self.sigmoid(linear_model)
        # 将概率值转换为类别标签(0或1)
        y_predicted_cls = [1 if i > 0.5 else 0 for i in y_predicted]
        return np.array(y_predicted_cls)

# 实例化和拟合逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 预测测试集样本的类别
y_pred_test = model.predict(X_test)

# 计算测试集准确率
test_accuracy = accuracy_score(y_test, y_pred_test)
print(f"测试集准确率: {test_accuracy:.2f}")

# 在训练集和测试集上进行预测
train_predictions = model.predict(X_train)
test_predictions = model.predict(X_test)

# 计算逻辑回归模型的准确率
train_accuracy = accuracy_score(y_train, train_predictions)
test_accuracy = accuracy_score(y_test, test_predictions)

print("\n逻辑回归模型 - 训练集准确率:", train_accuracy)
print("逻辑回归模型 - 测试集准确率:", test_accuracy)

# 计算MSE
train_mse = mean_squared_error(y_train, train_predictions)
test_mse = mean_squared_error(y_test, test_predictions)
print("\n逻辑回归模型 - 训练集 MSE:", train_mse)
print("逻辑回归模型 - 测试集 MSE:", test_mse)

# 输出训练得到的参数
print("\n逻辑回归模型参数:", model.weights)

# 输出逻辑回归模型的表达式
print("逻辑回归模型公式: y = ", end='')
for i, w in enumerate(model.weights):
    if i == 0:
        print(f"{w:.2f}", end='')
    else:
        print(f" + {w:.2f} * X[{i}]", end='')
print()

import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.family'] = ['Arial Unicode MS']

# 绘制逻辑回归模型的预测结果轮廓图
plt.figure(figsize=(10, 6))

# 生成网格点
xx, yy = np.meshgrid(np.linspace(X[:, 0].min(), X[:, 0].max(), 100),
                     np.linspace(X[:, 1].min(), X[:, 1].max(), 100))

# 使用模型预测网格点的类别
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# 绘制轮廓图
plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)

# 绘制训练集和测试集的真实结果
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='coolwarm', label='训练集真实结果')
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap='coolwarm', marker='x', label='测试集真实结果')

plt.xlabel('花萼长度 (cm)')
plt.ylabel('花萼宽度 (cm)')
plt.title('鸢尾花逻辑回归模型预测结果轮廓图')
plt.colorbar(label='类别')
plt.legend()
plt.grid(True)
plt.show()


  • 运行结果


  • 运行结果分析

测试集准确率为0.63,这表示模型在未见过的数据上的预测准确率为63%。

训练集准确率为0.53,这表示模型在训练集上的预测准确率为53%。

训练集 MSE 为0.47,测试集 MSE 为0.37,这些是模型在训练集和测试集上的均方误差,即模型预测值与实际值之间的平方差的均值。


逻辑回归模型参数为:

  • 偏置项为0.72。
  • 特征1的系数为-0.37。
  • 特征2的系数为0.58。

逻辑回归模型的表达式为: image.png

这个表达式描述了模型如何根据输入特征 X [ 1 ]和 X [ 2 ]来预测输出类别 y。


根据给定的参数:

  • 偏置项为 0.72 (β₀ = 0.72)
  • 特征1的系数为 -0.37 (β₁ = -0.37)
  • 特征2的系数为 0.58 (β₂ = 0.58)我们可以代入逻辑回归模型公式计算类别 0 和类别 1 的概率。


逻辑回归模型的公式为:

image.png

假设我们有以下特征值:

  • 花萼长度 (特征1) = 5.0 cm
  • 花萼宽度 (特征2) = 3.5 cm

代入公式进行计算:

image.png

  • 计算演示

首先,我们计算线性模型的输出:

image.png

然后,我们将z的值代入 sigmoid 函数计算类别 0 的概率:

image.png

最后,我们计算类别 1 的概率:

image.png

因此,根据给定的参数和特征值,类别 0 的概率约为 0.7116,而类别 1 的概率约为 0.2884。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
1月前
|
机器学习/深度学习 传感器 运维
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
本文探讨了时间序列分析中数据缺失的问题,并通过实际案例展示了如何利用机器学习技术进行缺失值补充。文章构建了一个模拟的能源生产数据集,采用线性回归和决策树回归两种方法进行缺失值补充,并从统计特征、自相关性、趋势和季节性等多个维度进行了详细评估。结果显示,决策树方法在处理复杂非线性模式和保持数据局部特征方面表现更佳,而线性回归方法则适用于简单的线性趋势数据。文章最后总结了两种方法的优劣,并给出了实际应用建议。
80 7
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
|
2月前
|
机器学习/深度学习 数据采集
机器学习入门——使用Scikit-Learn构建分类器
机器学习入门——使用Scikit-Learn构建分类器
|
2月前
|
机器学习/深度学习 算法 PyTorch
用Python实现简单机器学习模型:以鸢尾花数据集为例
用Python实现简单机器学习模型:以鸢尾花数据集为例
176 1
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
探索AI的奥秘:机器学习入门指南
【10月更文挑战第30天】本篇文章是一份初学者友好的机器学习入门指南,旨在帮助读者理解并开始实践机器学习。我们将介绍机器学习的基本概念,包括监督学习、无监督学习和强化学习等。我们还将提供一些实用的代码示例,以帮助读者更好地理解和应用这些概念。无论你是编程新手,还是有一定经验的开发者,这篇文章都将为你提供一个清晰的机器学习入门路径。
52 2
|
2月前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
机器学习基础:使用Python和Scikit-learn入门
40 1
|
2月前
|
机器学习/深度学习 数据采集 人工智能
机器学习入门:Python与scikit-learn实战
机器学习入门:Python与scikit-learn实战
77 0
|
2月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
45 0
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
158 4
|
15天前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
114 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
5天前
|
机器学习/深度学习 算法 网络安全
CCS 2024:如何严格衡量机器学习算法的隐私泄露? ETH有了新发现
在2024年CCS会议上,苏黎世联邦理工学院的研究人员提出,当前对机器学习隐私保护措施的评估可能存在严重误导。研究通过LiRA攻击评估了五种经验性隐私保护措施(HAMP、RelaxLoss、SELENA、DFKD和SSL),发现现有方法忽视最脆弱数据点、使用较弱攻击且未与实际差分隐私基线比较。结果表明这些措施在更强攻击下表现不佳,而强大的差分隐私基线则提供了更好的隐私-效用权衡。
36 14