【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

news2024/9/22 13:37:26

系列文章目录

监督学习:参数方法

【学习笔记】 陈强-机器学习-Python-Ch4 线性回归
【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归
【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv)
【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归
【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析
【学习笔记】 陈强-机器学习-Python-Ch8 朴素贝叶斯
【学习笔记】 陈强-机器学习-Python-Ch9 惩罚回归
【课后题练习】 陈强-机器学习-Python-Ch9 惩罚回归(student-mat.csv)

监督学习:非参数方法

【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch10 KNN法
【学习笔记】 陈强-机器学习-Python-Ch11 决策树(Decision Tree)

监督学习:集成学习

【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch12 随机森林(Random Forest)
【学习笔记】 陈强-机器学习-Python-Ch13 提升法

监督学习:支持向量机

【学习笔记】 陈强-机器学习-Python-Ch14 支持向量机

监督学习:人工神经网络


文章目录

  • 系列文章目录
    • 监督学习:参数方法
    • 监督学习:非参数方法
    • 监督学习:集成学习
    • 监督学习:支持向量机
    • 监督学习:人工神经网络
  • 前言
  • 一、人工神经网络(Artificial Neural Networks, ANN)
    • 正则化
  • 二、ANN回归 (使用sklearn)
    • 1. 载入、处理数据
    • 2. ANN 模型 估计:单一隐藏层(包含5个神经元)
        • `笔记:MLPRegressor()`
          • 【参数介绍】
          • 属性
    • 3. 画 神经网络系数矩阵的热图
    • 4.特征变量的置换重要性
      • 1)计算 置换重要性
      • 2)画 置换重要性的水平箱型图
        • 解读
      • 3)查看 置换重要性的具体取值
      • 4)画 偏依赖图
    • 5. 最优神经元数目(拟合优度)
    • 5. ANN:2个隐藏层
    • 6. 2个隐藏层的最优神经元数目
  • 三、ANN分类 (使用sklearn)
    • 1. 载入、处理数据
    • 2. ANN 模型 估计
      • 1)单一隐藏层(包含100个神经元)
        • `笔记:MLPClassifier()`
      • 2)2个隐藏层,神经元都是500个
    • 3. 正则化
      • 1)早停(Early Stopping)
      • 2)权重衰减(Weight Decay)
    • 4. 选出 最优惩罚参数


前言

本学习笔记 仅为以防自己忘记了,顺便分享给一起学习的网友们参考。如有不同意见/建议,可以友好讨论。

本学习笔记 所有的代码和数据都可以从 陈强老师的个人主页 上下载

参考书目:陈强.机器学习及Python应用. 北京:高等教育出版社, 2021.

数学原理等 详见陈强老师的 PPT


参考了:网友阡之尘埃的Python机器学习12——神经网络


一、人工神经网络(Artificial Neural Networks, ANN)

人工神经网络(Artificial Neural Networks, ANN) 是一种模仿生物神经网络结构和功能的计算模型,广泛应用于机器学习和人工智能领域。它由多个神经元(或节点)组成,通过连接(或权重)形成层次结构,用于处理复杂的输入数据并进行预测、分类等任务。
在这里插入图片描述
激活函数决定每个神经元的输出值,增加了网络的非线性能力。常见的激活函数包括:
· Sigmoid: σ ( x ) = 11 + e x p ⁡ ( − x ) σ ( x ) = 1 + e x p ( − x ) 1 ​ σ(x)=11+exp⁡(−x)σ(x)=1+exp(−x)1​ σ(x)=11+exp(x)σ(x)=1+exp(x)1​
· ReLU (Rectified Linear Unit): R e L U ( x ) = m a x ⁡ ( 0 , x ) ReLU(x)=max⁡(0,x) ReLU(x)=max(0,x)
· Tanh (Hyperbolic Tangent): t a n h ⁡ ( x ) = e x p ⁡ ( x ) − e x p ⁡ ( − x ) e x p ⁡ ( x ) + e x p ⁡ ( − x ) tanh⁡(x)=\frac{exp⁡(x)−exp⁡(−x)}{exp⁡(x)+exp⁡(−x)} tanh(x)=exp(x)+exp(x)exp(x)exp(x)
· Softmax: 通常用于分类问题,将输出转换为概率分布。
优化算法用于调整权重和偏置,以最小化损失函数。常见的优化算法包括:
- 梯度下降(Gradient Descent): 基本优化算法,通过计算损失函数的梯度来更新权重。
- Adam(Adaptive Moment Estimation): 自适应学习率的优化算法,结合了梯度下降的优点。

正则化

提前停止(Early Stopping):在训练过程中监控验证集上的性能,当性能不再提升时停止训练。有助于防止训练过程中过拟合。
- 实现方法: 记录训练过程中验证集的损失或准确率。当验证集性能不再改善(或恶化)时,停止训练。
权重衰减(Weight Decay):与L2正则化类似,通过在损失函数中添加权重的平方和来实现。主要用于控制权重的大小,防止模型过于复杂。
噪声注入: 在输入数据、权重更新或激活层中加入噪声,以提高模型的鲁棒性。可以防止模型对训练数据的过度拟合。

二、ANN回归 (使用sklearn)

以波士顿房价数据 boston为例(参见【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 )

1. 载入、处理数据

import numpy as np
import pandas as pd

#读取CSV文件的路径
csv_path = r'D:\桌面文件\Python\【陈强-机器学习】MLPython-PPT-PDF\MLPython_Data\spam.csv'
spam = pd.read_csv(csv_path)

#定义X与y
X = spam.iloc[:, :-1]
y = spam.iloc[:, -1]

#全样本随机分20%测试集和80%训练集
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, 
    stratify=y, 
    random_state=0)

#特征变量 标准化
from sklearn.preprocessing import StandardScaler
#生成一个实例scaler
scaler = StandardScaler()
#进行估计
scaler.fit(X_train)
#使用transform()分别将 训练集、测试集的特征变量进行标准化
X_train_s = scaler.transform(X_train)
X_test_s = scaler.transform(X_test)

2. ANN 模型 估计:单一隐藏层(包含5个神经元)

from sklearn.neural_network import MLPRegressor
model = MLPRegressor(
    solver='lbfgs', #L-BFGS算法,一种准牛顿算法
    hidden_layer_sizes=(5,), #单一隐藏层,包含5个神经元
    random_state=123,
    max_iter=10000)
model.fit(X_train_s, y_train)
model.score(X_test_s, y_test)

结果输出: 0.8570418638979551

#查看迭代次数
model.n_iter_

结果输出: 326

笔记:MLPRegressor()

MLPRegressor 是 scikit-learn 中的一个多层感知器(MLP)回归器,用于通过使用一个或多个隐藏层的神经网络模型来实现回归任务。这是一个非常灵活的工具,能够拟合非线性模型。

#基本语法和参数
from sklearn.neural_network import MLPClassifier
#创建模型
model = MLPRegressor(
    hidden_layer_sizes=(100, ),  #元组,表示每个隐藏层的神经元数目。默认 (100,)。例如 (50, 50) 表示两层,每层50个神经元。
    activation='relu', #激活函数的选择,可选 'identity', 'logistic', 'tanh', 'relu'。默认:'relu'
    solver='adam', #优化器的选择,可选 'lbfgs', 'sgd', 'adam'。默认:'adam'
    alpha=0.0001, #L2惩罚(正则化项)的系数。默认:0.0001
    batch_size='auto', #每次优化的小批量样本大小,默认:'auto' 表示 min(200, n_samples)。
    learning_rate='constant', #学习率的调整策略,可选 'constant', 'invscaling', 'adaptive'。默认:'constant'
    learning_rate_init=0.001, #初始学习率。默认:0.001
    power_t=0.5, #逆扩展学习率的指数。默认:0.5
    max_iter=200, #最大迭代次数。默认:200
    shuffle=True, #是否在每次迭代前打乱样本。默认:True
    random_state=None, 
    tol=0.0001, #优化的容忍度。默认:0.0001
    verbose=False, #是否打印进度消息。默认:False
    warm_start=False, #是否使用前一次训练结果继续训练。默认:False
    momentum=0.9, #动量的值,【仅当 solver='sgd' 时使用】。默认:0.9
    nesterovs_momentum=True, #是否使用 Nesterov 动量。默认:True
    early_stopping=False, #是否提前停止训练以防止过拟合。默认:False
    validation_fraction=0.1, #用于早停的验证集的比例。默认:0.1
    beta_1=0.9, #用于计算梯度及其平方的指数衰减率,【仅在 solver='adam' 时使用】。默认:0.9
    beta_2=0.999, #用于计算梯度及其平方的指数衰减率,【仅在 solver='adam' 时使用,用于梯度平方的计算】。默认:0.999
    epsilon=1e-8, #数值稳定性参数,【仅在 solver='adam' 时使用】。默认:1e-8
    n_iter_no_change=10, #用于早停的连续迭代次数,无改进时停止。默认:10
    max_fun=15000) #【lbfgs 求解器】的最大函数求值次数。默认:15000
【参数介绍】
  • activation 用于定义神经网络每个隐藏层中的激活函数。激活函数的作用是在神经元的输出上应用一个非线性变换,这是神经网络能够学习和执行更复杂任务的关键。
    • identity:无激活函数,输出等于输入。也就是说,激活函数 f ( x ) = x f(x)=x f(x)=x
    • logistic逻辑S型激活函数,表达式为 f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{−x}} f(x)=1+ex1
      • 此激活函数可以输出介于 0 和 1 之间的值,适用于需要输出概率或者需要强烈非线性的场景。因为它容易产生梯度消失,所以在深层网络中较少使用。
    • tanh双曲正切激活函数,表达式为 f ( x ) = t a n h ⁡ ( x ) f(x)=tanh⁡(x) f(x)=tanh(x)。​
      • 此激活函数的输出介于 -1 和 1 之间。它比逻辑激活函数表现出更好的性能,因为其输出以 0 为中心,通常用于隐藏层。
    • relu线性整流单元(Rectified Linear Unit),表达式为 f ( x ) = m a x ⁡ ( 0 , x ) f(x)=max⁡(0,x) f(x)=max(0,x)
      • ReLU 函数是最常用的激活函数之一,因为它在正区间内梯度恒定,避免了梯度消失问题,且计算简单。适用于大多数问题,尤其是深度学习网络。
  • solver 用于选择用于权重优化的算法。
    • adam Adam(Adaptive Moment Estimation)是一个相对较新的优化算法,它结合了 AdaGrad 和 RMSProp 算法的优点。
      • 它可以自适应地调整每个参数的学习率,并且通常表现出较快的收敛速度,在很多情况下都工作得很好。
      • 适合处理大规模的数据和参数量,因为它在每次迭代中有效地调整学习率,也适用于不是很平滑的数据。
      • 相对于其他求解器,它更加健壮,尤其是在模型结构较复杂或数据规模较大的情况下。
      • 大数据集和/或复杂模型:通常推荐使用 ‘adam’,因为它能够有效地处理大规模问题并且默认设置通常表现良好。
    • sgdSGD(Stochastic Gradient Descent)是最传统的优化算法,通过随机选择样本来更新权重。
      • 它使用固定的学习率进行权重更新,也可以通过设置 learning_rate 参数为 ‘invscaling’ 来逐渐减小学习率。
      • SGD 的优点在于简单,但它可能需要更多的迭代次数才能收敛,特别是在学习率选择不恰当的情况下。
      • 可以通过参数如 momentumnesterovs_momentum 来增强其性能,这些参数可以帮助克服局部极小值的问题和加速收敛。
      • 对收敛速度有特殊要求:如果需要更细粒度的控制或想要尝试不同的学习率调整策略,'sgd’可能是一个不错的选择,特别是当加入动量等参数优化时。
    • lbfgsL-BFGS(Limited-memory Broyden–Fletcher–Goldfarb–Shanno Algorithm)是一个基于拟牛顿方法的优化器,适合处理小到中等规模的数据集。
      • 它是一种二阶优化算法,相较于 SGD,它在每次迭代中利用更多的历史信息来更新权重,从而通常能更快地收敛。
      • L-BFGS 适用于数据较少、特征较少的场景,因为它在内存使用上更为高效,但在非常大的数据集上可能会遇到性能问题。
    • 小到中等数据集:可以考虑 ‘lbfgs’,尤其是当模型相对简单且数据量不是很大时。
  • learning_rate 用于指定用于权重更新的学习率的调整策略。学习率是控制模型学习速度的关键参数,选择合适的学习率调整策略可以帮助模型更好地收敛。
    • constant学习率在整个训练过程中保持不变。这适用于数据规模不是特别大,或者训练不需要过分精细调整的情况。
    • invscaling逆缩放调整,学习率随着时间 t t t 的增加按某种功能规模逐渐减小,通常按照 1 t p o w e r t ​ \frac{1}{t^ {power _t} }​ tpowert1 减少,其中 power_t 是一个用户定义的指数。
      • 适用于需要随着训练的进行逐步减小学习率以细致调整模型参数的场景。这种策略有助于在训练初期快速收敛,并在训练后期通过较小的步长提高模型的稳定性和性能。
    • adaptive如果在设置的迭代次数内,训练集的损失没有改善,学习率将会被减少。
      • 当模型的训练过程中出现停滞或者损失不再减少时,这种策略可以动态调整学习率,尝试摆脱局部最小值或促进进一步的收敛。这适用于那些对初始学习率比较敏感,或者训练过程中需要自适应调整以优化性能的复杂模型。
属性
coefs_:  网络中每个层的权重矩阵。
intercepts_: 网络中每个层的偏差向量。
n_iter_:  训练时的迭代次数。
loss_: 最终的损失函数值。
n_layers_: 网络的总层数。
n_outputs_: 输出层的单元数。
out_activation_: 输出层的激活函数。

3. 画 神经网络系数矩阵的热图

import matplotlib.pyplot as plt
import seaborn as sns

table = pd.DataFrame(
    model.coefs_[0], 
    index=columns,
    columns=[1,2,3,4,5])
sns.heatmap(abs(table), #abs 绝对值
			cmap='Blues', annot=True)
plt.xlabel('Neuron')
plt.title('Neural Network Weights (Absolute Values)')
plt.tight_layout()

在这里插入图片描述
由图可见,第二个神经元、第四个神经元的权重绝对值最大

4.特征变量的置换重要性

对于神经网络模型,无法像决策树模型(决策树、随机森林或提升法)那样计算每个变量的重要性。替代方法之一:计算每个变量的置换重要性(permutation importance)。

1)计算 置换重要性

**置换重要性(Permutation Importance)**是一种用于评估特征对模型预测影响的技术。它通过打乱特征的值来测量模型性能的下降,从而判断该特征的重要性。
步骤
   1)训练模型:使用完整的数据集训练模型。
   2)计算基准分数:在未打乱特征之前,计算模型的性能指标(如准确率、AUC等)。
   3)打乱特征:对一个特征进行随机打乱,使其与目标变量的关系被破坏。
重新计算分数:在打乱后的数据上评估模型性能。
   4)计算重要性:重要性等于基准分数与打乱后分数的差异,差异越大,说明特征的重要性越高。

#特征变量的置换重要性 permutation_importance()
from sklearn.inspection import permutation_importance
result = permutation_importance(
    model, 
    X_test_s,
    y_test, 
    n_repeats=20, #重复20次
    random_state=42)
dir(result) #查看result的组成

结果输出: [‘importances’, ‘importances_mean’, ‘importances_std’] result 对象包含三个主要属性:importances 每个特征在每次置换中重要性的值;importances_mean 每个特征的重要性的平均值;importances_std 每个特征重要性的标准差,显示该特征重要性估计的变异性。

2)画 置换重要性的水平箱型图

置换重要性的水平箱型图(Horizontal Box Plot for Permutation Importance)是一种用于可视化特征重要性分布的图形方法。它可以帮助我们理解每个特征对模型性能的影响,以及各特征在多次置换中的表现波动情况

#画 置换重要性的水平箱型图
index = result.importances_mean.argsort()
plt.boxplot(result.importances[index].T, 
            vert=False, #水平箱型图
            labels=X_test.columns[index])
plt.title('Permutation Importances')

在这里插入图片描述

解读
箱体(Box):表示特征重要性的四分位数范围(从 25% 到 75%),中间的线为中位数。箱体的长度显示了该特征重要性值的集中程度。
须(Whiskers):伸展至箱体的上下边缘,表示数据的范围(通常为 1.5 倍四分位距)。须外的点表示异常值。
中位数线(Median Line):箱体中的水平线表示该特征的重要性中位数,提供了该特征的重要性的中心趋势。
异常值(Outliers):箱体须之外的点表示异常值,显示了特征重要性估计中的极端变化。

3)查看 置换重要性的具体取值

pd.DataFrame(
    result.importances_mean[index], 
    index=X_test.columns[index], 
    columns=['mean_importance'])

结果输出:
在这里插入图片描述
由置换重要性的水平箱型图和取值 可知,LASTAT和RM是最重要的两个变量,与决策树、随机森林、提升法所得结果一致。

4)画 偏依赖图

# 画偏依赖图
from sklearn.inspection import PartialDependenceDisplay
PartialDependenceDisplay.from_estimator(model, X_train_s, ['LSTAT', 'RM'])

结果输出:
在这里插入图片描述

5. 最优神经元数目(拟合优度)

1)使用 f o r for for循环找出最优神经元个数(最高 R 2 R^2 R2

'''寻找最优神经元个数:R^2'''
#for循环
scores = []
for n_neurons in range(1, 41): #神经元取值范围1-41
    model = MLPRegressor(
        solver='lbfgs',
        hidden_layer_sizes=(n_neurons,),
        random_state=123, max_iter=10000)
    model.fit(X_train_s, y_train)
    score = model.score(X_test_s, y_test)
    scores.append(score)
 
index = np.argmax(scores)
range(1, 41)[index]

结果输出: 8

2)画图展示

#画出 折线图
plt.plot(range(1, 41), scores, 'o-')
plt.axvline(range(1, 101)[index], 
            linestyle='--', color='k', linewidth=1)
plt.axhline(max(scores), 
            linewidth=1, linestyle='--', color='r')
# 标记交点
best_n_nodes = range(1, 41)[index]
best_score = max(scores)
plt.scatter(best_n_nodes, best_score, color='b', zorder=5)
plt.text(best_n_nodes, 
         best_score, f'({best_n_nodes},  {best_score:.6f})', 
         horizontalalignment='right', 
         verticalalignment='bottom', fontsize=11, color='b')

plt.xlabel('Number of Nodes')
plt.ylabel('R2')
plt.title('Test Set R2 vs Number of Nodes')

在这里插入图片描述

3)最优模型

model = MLPRegressor(
    solver='lbfgs', 
    hidden_layer_sizes=(8,),
    random_state=123,
    max_iter=10000)
model.fit(X_train_s, y_train)
model.score(X_test_s, y_test)

结果输出: 0.9029614612418355

4)画偏依赖图

PartialDependenceDisplay.from_estimator(
    model, X_train_s, ['LSTAT', 'RM'])

结果输出:
在这里插入图片描述
RM对响应变量的MEDV的偏作用不再是先降后升的非单调关系了。

5. ANN:2个隐藏层

model = MLPRegressor(
    solver='lbfgs',
    hidden_layer_sizes=(5,5), #2隐藏层,包含5个神经元
    random_state=123,
    max_iter=10000)
model.fit(X_train_s, y_train)
model.score(X_test_s, y_test)

结果输出: 0.8826157510840963

6. 2个隐藏层的最优神经元数目

#双重for循环:同时选出第1、第2层的最优神经元数目
best_score = 0
best_sizes = (1, 1)
for i in range(1, 11):
    for j in range(1, 11):
        model = MLPRegressor(solver='lbfgs', hidden_layer_sizes=(i, j), random_state=123, max_iter=10000)
        model.fit(X_train_s, y_train)
        score = model.score(X_test_s, y_test)
        if best_score < score:
            best_score = score
            best_sizes = (i, j)
best_score

结果输出: 0.9088351462167137

#展示最优模型的网络结构
best_sizes

结果输出: (8, 10) 第一层8个,第二层10个

三、ANN分类 (使用sklearn)

使用过滤垃圾邮件的spam数据( 参见【学习笔记】 陈强-机器学习-Python-Ch8 朴素贝叶斯 )

1. 载入、处理数据

import numpy as np
import pandas as pd

#读取CSV文件的路径
csv_path = r'D:\桌面文件\Python\【陈强-机器学习】MLPython-PPT-PDF\MLPython_Data\spam.csv'
spam = pd.read_csv(csv_path)

#定义X与y
X = spam.iloc[:, :-1]
y = spam.iloc[:, -1]

#全样本随机分20%测试集和80%训练集
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, 
    stratify=y, 
    random_state=0)

#特征变量 标准化
from sklearn.preprocessing import StandardScaler
#生成一个实例scaler
scaler = StandardScaler()
#进行估计
scaler.fit(X_train)
#使用transform()分别将 训练集、测试集的特征变量进行标准化
X_train_s = scaler.transform(X_train)
X_test_s = scaler.transform(X_test)

2. ANN 模型 估计

1)单一隐藏层(包含100个神经元)

from sklearn.neural_network import MLPClassifier

model = MLPClassifier( #默认solver= 'adam'。
    hidden_layer_sizes=(100,), #单隐藏层,100个神经元
    random_state=123, max_iter=10000)
model.fit(X_train_s, y_train)
model.score(X_test_s, y_test)

结果输出: 0.9489685124864278

#查看迭代次数
model.n_iter_

结果输出: 283

笔记:MLPClassifier()

MLPClassifier() 是 Scikit-Learn 库中的一个类,用于实现多层感知器(MLP)算法,这是一种监督学习算法,通过训练数据来进行分类。MLP 属于神经网络的一种,可以用于解决复杂的模式识别和分类问题。

#基本语法和参数
from sklearn.neural_network import MLPClassifier
#创建模型
model = MLPClassifier(
    hidden_layer_sizes=(100,), #元组,表示每个隐藏层的神经元数目。默认 (100,)
    activation='relu', #激活函数的类型:'identity', 'logistic', 'tanh', 或 'relu'。默认为 'relu'。
    solver='adam', #用于优化权重的求解器:'lbfgs', 'sgd', 或 'adam'。默认为 'adam'。
    alpha=0.0001, #L2 正则化参数,用于控制过拟合。默认值为 0.0001。
    batch_size='auto', #每次迭代用于训练网络的最小样本数。默认为 'auto',即 min(200, n_samples)。
    learning_rate='constant', #学习率调度策略,可选 'constant', 'invscaling' 或 'adaptive'。默认为 'constant'。
     learning_rate_init=0.001, #初始学习率。默认:0.001
    power_t=0.5, #逆扩展学习率的指数。默认:0.5
    max_iter=200, #最大迭代次数。默认:200
    shuffle=True, #是否在每次迭代前打乱样本。默认:True
    random_state=None, 
    tol=0.0001, #优化的容忍度。默认:0.0001
    verbose=False, #是否打印进度消息。默认:False
    warm_start=False, #是否使用前一次训练结果继续训练。默认:False
    momentum=0.9, #动量的值,【仅当 solver='sgd' 时使用】。默认:0.9
    nesterovs_momentum=True, #是否使用 Nesterov 动量。默认:True
    early_stopping=False, #是否提前停止训练以防止过拟合。默认:False
    validation_fraction=0.1, #用于早停的验证集的比例。默认:0.1
    beta_1=0.9, #用于计算梯度及其平方的指数衰减率,【仅在 solver='adam' 时使用】。默认:0.9
    beta_2=0.999, #用于计算梯度及其平方的指数衰减率,【仅在 solver='adam' 时使用,用于梯度平方的计算】。默认:0.999
    epsilon=1e-8, #数值稳定性参数,【仅在 solver='adam' 时使用】。默认:1e-8
    n_iter_no_change=10, #用于早停的连续迭代次数,无改进时停止。默认:10
    max_fun=15000) #【lbfgs 求解器】的最大函数求值次数。默认:15000

2)2个隐藏层,神经元都是500个

model = MLPClassifier(
    hidden_layer_sizes=(500, 500), #2个隐藏层,神经元都是500个
    random_state=123, max_iter=10000)
model.fit(X_train_s, y_train)
model.score(X_test_s, y_test)

结果输出: 0.9391965255157437

#查看迭代次数
model.n_iter_

结果输出: 44

3. 正则化

以上结果显示,模型可能已经过拟合。
**正则化(Regularization)**是一种用于防止机器学习模型过拟合(overfitting)的方法。它通过在模型训练过程中加入额外的惩罚项来限制模型的复杂度,从而使模型在面对新数据时具有更好的泛化能力。

1)早停(Early Stopping)

#采用 早停的方法进行正则化
model_es = MLPClassifier(
    hidden_layer_sizes=(500, 500), 
    early_stopping=True, #早停
    validation_fraction=0.25, #随机选取25%的训练集作为验证集
    random_state=123, max_iter=10000)
model_es.fit(X_train_s, y_train)
model_es.score(X_test_s, y_test)

结果输出: 0.9457111834961998 提高了一点

#查看迭代次数
model_es.n_iter_

结果输出: 30 迭代次数下降

2)权重衰减(Weight Decay)

#采用 权重衰退的方法进行正则化
model_wd = MLPClassifier(
    hidden_layer_sizes=(500,500),  
    alpha=0.1, #将L_2惩罚参数设为0.1
    random_state=123,max_iter=10000)
model_wd.fit(X_train_s, y_train)
model_wd.score(X_test_s, y_test)

结果输出: 0.9467969598262758 提高了一点

#查看迭代次数
model_wd.n_iter_

结果输出: 65迭代次数有所增加

4. 选出 最优惩罚参数

1)计算 混淆矩阵

pred = model_wd.predict(X_test_s)
from sklearn.metrics import ConfusionMatrixDisplay
ConfusionMatrixDisplay.from_predictions(
    y_test, pred)

结果输出:
在这里插入图片描述

2)生成月亮形状的模型数据

from sklearn.datasets import make_moons
X,y = make_moons(n_samples=100)
#画图展示
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.DataFrame(X, columns=['x1','x2'])
sns.scatterplot(x='x1', y ='x2',
               data=data,
               hue=y, palette=['blue','black'])

结果输出:
在这里插入图片描述
make_moons()默认生产确定性的两类数据。

笔记:make_moons()

make_moons() 是一个用于生成二分类数据集的函数,常用于测试分类算法。它生成两个半月形状的分类数据点,通常用于演示机器学习模型的性能,尤其是在具有非线性决策边界的任务中。

#基本语法和参数
from sklearn.datasets import make_moons

# 生成数据
X, y = make_moons(
	n_samples=100, #生成的数据点的总数。如果是单个整数,则生成相同数量的正负样本。默认:100
	noise=0.2, #数据点的噪声水平。这个值表示添加到数据中的高斯噪声的标准差,较大的值会使数据点分布更加模糊。默认:0.2
	random_state=None)
#返回值
#    X (array of shape [n_samples, 2]):生成的特征数据,形状为 (n_samples, 2)。
#    y (array of shape [n_samples]):生成的目标标签,包含 0 和 1 两个类别。

3)加入随机噪音

X,y = make_moons(n_samples=100,
                noise=0.3, #加入标准差=0.3的正态随机变量
                random_state=0)
#画图展示
data = pd.DataFrame(X, columns=['x1','x2'])
sns.scatterplot(x='x1', y ='x2',
               data=data,
               hue=y, palette=['blue','black'])

结果输出:
在这里插入图片描述

4)生成1000个观测值,构建测试集

X_test, y_test = make_moons(
    n_samples=1100, 
    noise=0.3, 
    random_state=0)
X_test = X_test[100:, :]
y_test = y_test[100:]

5)计算测试集的预测准确率

#估计双隐藏测模型
model = MLPClassifier(
    hidden_layer_sizes=(100, 100),
    random_state=123, max_iter=10000)
model.fit(X, y)
#计算 测试集的预测准确率
model.score(X_test, y_test)

结果输出: 0.895

6) f o r for for 循环考察惩罚参数的正则化作用(决策边界)

from mlxtend.plotting import plot_decision_regions
plt.figure(figsize=(9, 6)) #设定画布尺寸   
for i, alpha in enumerate([0.01, 0.1, 1, 10]): #alpha取值分布为0.01, 0.1, 1, 10
    model = MLPClassifier(
        hidden_layer_sizes=(100, 100), 
        alpha=alpha,
        random_state=123, max_iter=10000)
    model.fit(X, y)
    plt.subplot(2, 2, i + 1)
    accuracy = model.score(X_test, y_test)
    plot_decision_regions(X, y, model, legend=0)
    plt.xlabel('x1')
    plt.ylabel('x2')
    plt.title(f'alpha = {alpha}')
    plt.text(-2, 2, f'Accuracy = {accuracy}')
plt.subplots_adjust(hspace=0.5, wspace=0.3)
plt.tight_layout()

在这里插入图片描述
由上图可见, alpha=0.01(惩罚极小),决策边界不光滑,存在过拟合。 alpha=10(惩罚大),决策边界过于光滑,存在千拟合,预测准确度也较低(0.831) 相较而言,alpha=1时,决策边界比较能捕捉数据特征,预测准确度相对最好(0.916)。

笔记:enumerate()

enumerate() 是 Python 内置的一个函数,用于在遍历序列时同时获取元素的索引和值。它非常适合于需要同时获取元素及其位置的场景,如在循环中需要知道当前元素的索引时。

#基本语法和参数
enumerate(
	iterable, #一个可迭代对象,如列表、元组、字符串等。
	start=0) #索引的起始值,默认为 0。

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

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

相关文章

[AHK] 调用函数动态生成ListBox窗口

需求背景 动态生成向导对话框&#xff0c;由用户选一个选项&#xff0c;类似做选择题。 运行效果 AHK v1 代码 if(A_ScriptFullPathA_LineFile)MsgBox % ListBox("窗口标题", "这是一个生成listbox的Demo", "a|b|c|d|",3) return ;---------…

【小沐学OpenGL】Ubuntu环境下glew的安装和使用

文章目录 1、简介1.1 OpenGL简介1.2 glew简介 2、安装glew2.1 命令安装glew2.2 直接代码安装glew2.3 cmake代码安装glew 3、测试glew3.1 测试glewfreeglut3.2 测试glewglfw 结语 1、简介 1.1 OpenGL简介 Linux 系统中的 OpenGL 是一个跨语言、跨平台的应用程序编程接口&#…

智能的PHP开发工具PhpStorm v2024.2全新发布——支持日志文件

PhpStorm是一个轻量级且便捷的PHP IDE&#xff0c;其旨在提高用户效率&#xff0c;可深刻理解用户的编码&#xff0c;提供智能代码补全&#xff0c;快速导航以及即时错误检查。可随时帮助用户对其编码进行调整&#xff0c;运行单元测试或者提供可视化debug功能。 立即获取PhpS…

【私活儿分享】手串珠子管理小程序,便捷查询珠子(串手链的珠子)位置

前言 之间帮客户做了个查询手串珠子位置的小程序&#xff0c;便于帮助客户管理众多的珠子&#xff0c;这个珠子就是戴在手上串起来的饰品。好了&#xff0c;话不多说&#xff0c;进入正题&#xff01; 正文 小程序比较简单&#xff0c;采用云开发。两个页面&#xff0c;一个查…

Git 新手指南

Git 命令大全 Git 是目前最流行的分布式版本控制系统&#xff0c;用于跟踪文件的更改&#xff0c;协调不同开发者的协作。掌握 Git 命令能够极大提高工作效率&#xff0c;尤其在软件开发过程中。本文将详细介绍 Git 的一些常用命令&#xff0c;帮助你更好地理解和使用 Git。 1…

一款免费开源的截图软件,SETUNA截图软件

SETUNA是一款功能强大且便捷的屏幕截图工具&#xff0c;适用于多种场景&#xff0c;包括日常办公、学习和游戏娱乐等。该软件的主要特点如下&#xff1a; 高效截图&#xff1a;用户可以轻松截取屏幕上的任何部分&#xff0c;并且支持自定义选取截图范围。图片编辑功能&#xf…

聊聊go语言channel中的一些小技巧

写在文章开头 go语言提供了各种非常方便的语法糖&#xff0c;使得我们实现用最少的语法做尽可能高效的事情&#xff0c;而本文就简单介绍如何实现非阻塞处理多个channel&#xff0c;希望对你有帮助。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的技…

项目进度一

一.双token验证登陆/注册 1.在前端中&#xff0c;得到响应记录acessToken和 refreshToken ,并记录在 localStorage中&#xff0c;当登录之后的请求都要携带着accessToken,如果accessToken过期&#xff0c;就再验证一下refreshToken&#xff0c;如果也过期就需要重新登录&#…

亚马逊测评自养号卖家如何以低成本提高店铺产品曝光率和销量?

在跨境电商领域&#xff0c;随着市场日趋饱和和竞争加剧&#xff0c;卖家普遍面临流量低、转化率低的共同挑战。为了在这种严重的“内卷化”环境中脱颖而出&#xff0c;不少卖家投入了大量的资金和资源&#xff0c;尝试了各种站内和站外的推广方式&#xff0c;但往往因为缺乏成…

Vue2中使用ant-design的tab组件让他一行充满

使用tabs组件默认样式这样 想改成水平居中铺满如下&#xff1a; 需要改下css样式 /deep/ .ant-tabs-nav {width: 100%;& > div {width: 100%;display: flex;align-items: center;}.ant-tabs-tab {flex: 1;text-align: center;}}

Python中matplotlib-legend图例水平排列

在matplotlib中&#xff0c;图例是用来标识不同数据系列或不同类别的标记和颜色的标签。有时候我们希望将图例水平排列&#xff0c;以节省空间并使得图例更加美观。本文将介绍如何在matplotlib中实现图例的水平排列。 方法一&#xff1a;使用legend的loc参数 我们可以通过leg…

Android通知(Notification)的基本用法

Android通知&#xff08;Notification&#xff09;的基本用法 通知&#xff08;Notification&#xff09;是Android系统中比较有特色的一个功能&#xff0c;当某个应用程序希望向用户发出一些提示信息&#xff0c;而该应用程序又不在前台运行时&#xff0c;就可以借助通知来实…

云计算实训43——部署k8s基础环境、配置内核模块、基本组件安装

一、K8S基本概念 1、k8s是什么 K8S是Kubernetes的 缩写&#xff0c;由于k 和 s 之间有⼋个字符&#xff0c;所以因此得名。 Kubernetes 是⼀个可移植的、可扩展的开源平台&#xff0c;⽤于管理容器化 的⼯作负载和服务&#xff0c;可促进声 明式配置和⾃动化。 2、k8s的功…

pico 手臂手部手指完整版

别忘了设置好pico的设置和导入需要的样式 一、动画设置 1.1设置Avatar 遮罩; 1.2创建动画、手指动画的话&#xff0c;我创建了四个&#xff0c;分别对应的是&#xff08;平展、弯曲食指、弯曲其他手指、握拳&#xff09; 1.3建立分层、我建了三层&#xff0c;默认层&#xff…

第二十章 加密 SOAP 主体

文章目录 第二十章 加密 SOAP 主体加密概述加密 SOAP 主体 第二十章 加密 SOAP 主体 本主题介绍如何加密 IRIS Web 服务和 Web 客户端发送的 SOAP 消息正文。 主题“加密安全标头元素”和“使用派生密钥令牌进行加密和签名”描述了如何加密安全标头元素以及加密 SOAP 主体的其…

这10个提示词技巧太强了,用过的人都说真香!

ChatGPT 已经发布一年多了&#xff0c;这一年&#xff0c;我们经常会听到“提示词工程&#xff08;Prompt Engineering&#xff09;”这个术语&#x1f4bb; 在探讨这个概念之前&#xff0c;我们需要先了解什么是Prompt&#xff08;提示词&#xff09;&#x1f914; 简单来说…

面试题复习(0902-0909)

1. 完全背包问题 和01背包唯一的区别是&#xff0c;每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09; 代码和01唯一的区别在于j的循环是从小到大&#xff0c;不是从大到小。ij谁在外谁在内层区别不大。 #include <bits/stdc.h> using namespace std…

Linux(2)--VmWare虚拟机安装

文章目录 1. VmWare概念2. 安装步骤2.1 下载2.2 安装过程 3. 小结 1. VmWare概念 现在我们要学习Linux了&#xff0c;需要有一台安装Linux系统的计算机。 但是我们又不想放弃Windows&#xff0c;毕竟平时办公、娱乐还得用。 此时可以在电脑上安装VmWare虚拟机软件&#xff0…

C:9-9题目:蛇形矩阵

一、题目介绍&#xff1a; 给你两个整数n&#xff0c;m&#xff0c;请你构造一个n行m列的蛇形方阵&#xff0c;在这个方阵中&#xff0c;数字由1到nm&#xff0c;从最右上角开始&#xff0c;呈环状(逆时针)向内填充。 比如一个3*3的蛇形方阵 3 2 1 4 9 8 5 6 7 二、解题思路&a…

Dropout正则化:提升PyTorch模型性能的神器!

本文展示了在PyTorch模型中添加Dropout正则化如何影响模型在损失和准确率方面的性能。 Dropout正则化在机器学习中的意义是什么&#xff1f; Dropout正则化是机器学习中的一种方法&#xff0c;通过在神经网络中随机丢弃一些单元&#xff08;神经元&#xff09;来模拟同时训练多…