Python随堂笔记

文章探讨了lambda函数的匿名特性、网络安全中的map_attack函数、LabelEncoder在编码分类特征、设置random_state保证复现性、以及深度学习中的batch_size、epoch概念,还涉及Keras中的MaxPool1D、LSTM和Dense层,以及模型编译、评估和分类报告的使用。
摘要由CSDN通过智能技术生成

### 1.lambda 函数是匿名的:
所谓匿名函数,通俗地说就是没有名字的函数。lambda函数没有名字。
lambda 函数有输入和输出:
输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。
lambda 函数拥有自己的命名空间:
不能访问自己参数列表之外或全局命名空间里的参数,只能完成非常简单的功能。
常见的lambda函数示例:
 

lambda x, y: x*y			# 函数输入是x和y,输出是它们的积x*y
lambda:None					# 函数没有输入参数,输出是None
lambda *args: sum(args)		# 输入是任意个数参数,输出是它们的和(隐性要求输入参数必须能进行算术运算)
lambda **kwargs: 1			# 输入是任意键值对参数,输出是1

### 2map_attack()

在网络安全领域,map_attack()这个函数的作用通常是将不同类型的网络攻击映射到数字类别,用于构造数据集标签。

map_attack()会接收攻击名称,然后返回映射后的数字类别。

def map_attack(attack):
    attack_map = {
        'normal': 0,
        'bruteforce': 1,
        'sqlinjection': 2, 
        'xss': 3
    }

    return attack_map[attack]

### 3.LabelEncoder()

LabelEncoder()是scikit-learn库中的一个类,用于将分类特征的值进行编码,使其可以被机器学习算法接受。

其主要功能是:

  • 将分类特征的字符串值编码为整数值(0,1,2...)
  • 保证编码后的特征仍然保持原始特征的顺序.
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder() 

data = ['a','b','c','a','b']
le.fit(data)

print(le.transform(data))

# [0 1 2 0 1]

le.fit(data)

在sklearn的LabelEncoder类中,le.fit(data)是一个拟合数据的方法,其作用主要有:

  1. 收集数据集data中的所有唯一类别。
  2. 对这些唯一类别进行排序,并将其映射到0到n_classes-1的整数值。
  3. 在LabelEncoder类内部生成一个dict,用于存储类别到整数值的映射关系。
  4. 根据这个映射关系,可将新输入的数据转换成整数编码。
data = ['a','b','c','a'] 

le = LabelEncoder()
le.fit(data) 

print(le.classes_)
# ['a' 'b' 'c'] 

print(le.transform(['a','b']))  
# [0 1]

这里,le.fit(data) 收集了data中的唯一类别['a','b','c'],并将其映射到[0,1,2]。

这样,在后续使用le.transform()时,就可以根据fit时生成的映射关系,将新数据转换成编码。

所以简单来说,le.fit()是进行训练生成转换所需的映射字典,transform()方法则使用该映射字典来转换新数据。

fit_transform()

在scikit-learn中,fit_transform()是一个常见的组合方法,它将fit()和transform()两个方法合并为一个方法:

  • fit():用来学习数据集的统计属性,如类别,均值方差等等,从而生成数据转换所需的映射等。
  • transform():用来将数据根据fit()步骤学习到的映射等转换为新的形式。

fit_transform()就是将两者合并为一个方法,先fit后transform,即先学习数据属性然后转换数据。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

data = [[0, 2], [1, 3], [4, 3]]

print(scaler.fit_transform(data))

这里StandardScaler标准化数据的过程:

  1. fit(): 计算数据的均值和标准差
  2. transform(): 使用上述均值和标准差,对数据进行标准化转换

fit_transform()将两步合并,计算并应用均值和标准差,直接输出转换后的数据。

所以fit_transform()是一个很方便的方法,无需手动分步调用fit()和transform(),适合于像预处理或编码转换等需要学习数据属性再转换数据的场景。

###4 random_state取值怎么保证复现

在机器学习代码中,random_state参数的取值对保证结果复现非常重要。关于random_state的取值建议:

  1. 每次实验使用相同的随机数种子(random_state值)。例如设置为0,或一个固定的整数。
  2. 对不同的随机进程设置不同的random_state。例如训练集测试集分割与模型参数初始化使用不同的random_state。
  3. 不要使用默认的random_state值,默认是None,每次的随机数会不一样。
  4. 在比较不同模型时,保持随机数种子不变,从而减少随机误差的影响。
  5. 最终选择出的最佳模型要锁定random_state,保证模型结果可复现。
  6. 避免使用完全随机的random_state值,这无法复现结果。
  7. 将random_state固定下来也便于代码的可维护性,不需要每次修改random_state值。

总之,设置固定的random_state是一个好习惯。同时要注意,仅锁定random_state不能保证100%完全复现,还与硬件,操作系统,软件版本等相关。但这已可大大提高复现性。在报告结果时也应说明所使用的random_state。

如果 random_state 等于某个固定的值, 如42,将得到同样的数据划分;

如果 random_state 等于另外某个值,将得到另外一份不同的数据划分;

如果 random_state = None (默认值),会随机选择一个种子,这样每次都会得到不同的数据划分。

给 random_state 设置相同的值,那么当别人重新运行你的代码的时候就能得到完全一样的结果,复现和你一样的过程。

### 5.batch_size,iteration,epoch之间的关系

(1)iteration:表示1次迭代,每次迭代更新1次网络结构的参数,1个iteration等于使用batchsize个样本训练一次;

(2)batch_size:批大小,即1次迭代所使用的样本量。在深度学习中,一般采用SGD(随机梯度下降算法)训练,即每次训练在训练集中取batchsize个样本训练;

(3)epoch:1个epoch等于使用训练集中的全部样本训练一次。

### 5.

model.add(MaxPool1D(pool_size=(2)))

这行代码用于在Keras模型中添加一个一维最大池化层(MaxPool1D)。

MaxPool1D常用于处理一维序列数据,例如自然语言或时间序列等。

其中:

  • MaxPool1D表示一维最大池化层的类。
  • pool_size=2表示池化窗口大小为2。

MaxPool1D的池化窗口会在输入数据上滑动,并提取窗口内最大值。

例如输入序列[1, 2, 3, 4], 池化大小为2,则输出结果为[2, 4]。

MaxPool1D可以在时间轴或者特征轴上进行池化操作。

在时间轴上池化,可以降低时间序列的采样率,减小计算量,并获得在时间轴上窗口内数据的最大特征。

在特征轴上池化,可以减少特征数量,防止过拟合。

通过调整池化大小pool_size,可以获得不同粒度的特征提取。池化层通常会在卷积层后面,用于提高模型的泛化能力。

所以Keras中的MaxPool1D层是处理一维输入的重要组件之一。

 ### 6.model.add(LSTM(units=16,return_sequences=False,dropout=0.2))

这是在Keras中定义一个LSTM层的代码,各个参数的作用如下:

  • units=16:定义了该LSTM层的输出维度大小为16,即隐状态向量的大小为16个特征。
  • return_sequences=False:表示该LSTM层只返回最后一个时间步的输出,而不是序列中的全部输出。
  • dropout=0.2: 在LSTM层使用dropout技术,丢弃20%的神经元,用于正则化防止过拟合。

此外,该LSTM层的其他默认参数包括:

  • input_shape:会自动从前一层获得输入数据shape
  • activation:default使用tanh激活
  • recurrent_activation:隐状态recurrent的激活函数,default是sigmoid
  • use_bias: 是否使用bias,默认True
  • kernel_initializer: 权重初始化方法,默认glorot_uniform
  • recurrent_initializer: 递归连接初始化方法,默认orthogonal
  • unit_forget_bias:是否使用遗忘门偏置,默认True

我们可以根据需要调整units大小,dropout值,以及是否return_sequence等,来构建不同的LSTM层配置。这是Keras中定义LSTM的常用方式。

 ### 7 model.add(Dense(units=1))

这行代码是在Keras模型中添加一个全连接层(Dense)。

其中:

  • Dense表示一个全连接层。
  • units=1 表示该全连接层输出节点个数为1。

这意味着该全连接层将输入压缩到一个单节点的输出。

假设输入数据shape为(batch_size, input_dim),那么该全连接层的计算过程为:

  1. 输入数据X乘以权重W,其中W大小为(input_dim, 1)
  2. 加上偏置b,其中b大小为(1,)
  3. 经过激活函数(默认为线性激活None)
  4. 最终输出一个长度为1的向量,表示每个样本的预测值

这种只有一个输出节点的全连接层通常用于:

  1. 回归问题的最终预测输出
  2. 二分类问题的逻辑回归输出
  3. 为后续的Sigmoid激活做准备

通过调整units数量,可以建立不同输出维度的全连接层,用于各种机器学习任务。

 ### 8.model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

这行代码是在Keras中编译模型,为模型训练做准备。

其中参数含义:

  • loss='binary_crossentropy':指定训练使用的损失函数为二进制交叉熵。这通常用于二分类问题。
  • optimizer='adam':指定使用Adam优化器来更新模型权重。Adam是一个较常用的优化器。
  • metrics=['accuracy']:列表指定训练时使用accuracy指标。这里将跟踪并输出训练/测试的accuracy。

compile主要完成:

  1. 指定损失函数loss,这决定了模型试图优化的目标。
  2. 指定优化器optimizer,来更新模型参数以最小化loss。
  3. 指定训练/测试期间要监控的指标metrics,如accuracy等。

通过compile配置这些参数后,模型就 Ready for Training了。

 ### 9.

model.evaluate(X_test, Y_test, verbose=1)

model.evaluate在Keras中是对测试集进行评估的函数。

其中:

  • X_test: 输入测试集特征
  • Y_test: 输入测试集标签
  • verbose:日志冗长度,设置为1会输出评估日志信息

evaluate会对测试集进行前向运算,比较模型对测试集的预测与真实标签,计算测试集上的loss和metrics。

这个函数常用于模型训练完成后,在一个新的测试集上测试模型表现。可以获得测试集上的loss和metrics,判断模型的最终泛化能力。

调用evaluate返回一个标量的测试loss,以及一个标量列表,包含在模型编译时指定的metrics的值。

例如编译时metrics=['accuracy'],则evaluate返回包括:

  • 测试损失loss
  • 测试准确率accuracy

evaluate提供了快速判断模型在新数据上的泛化表现的简单方法。通常训练后需要调用evaluate,并判断loss和metrics是否符合要求。也可以用于多模型比较选取最佳模型。

### 10.

pd.DataFrame(history.history)   

pd.DataFrame(history.history)[['accuracy', 'val_accuracy']].plot()

pd.DataFrame(history.history)

这行代码利用Pandas的DataFrame来保存Keras模型训练过程中的history数据。

在Keras模型训练完成后,可以通过history对象获取训练过程中的关键数据,主要包括:

  • history.history['loss']: 训练集loss的变化
  • history.history['val_loss']: 验证集loss的变化
  • history.history['acc']: 模型在训练集上的accuracy
  • history.history['val_acc']: 模型在验证集上的accuracy

等等。history中还可能包含其他metrics的数据变化曲线。

通过将history.history转换为Pandas的DataFrame,可以方便地保存这些训练日志数据,并进行后续分析。

主要的优势有:

  • 将训练日志以表格化的数据格式保存,便于存储与读取
  • 可以利用Pandas的分析工具进一步分析训练情况
  • 可以将训练日志可视化为曲线图
  • 可以输出为csv文件等格式

总之,这使得Keras模型的训练日志可以方便地进行数据化的存储、处理和分析,是保存和分析模型训练日志的常用方法之一。

pd.DataFrame(history.history)[['accuracy', 'val_accuracy']].plot()

这行代码使用Pandas和Matplotlib绘制了Keras训练历史(history)中的accuracy和val_accuracy曲线图。

具体步骤:

  1. history.history包含训练过程中记录的指标。
  2. pd.DataFrame(history.history)将其转换为Pandas DataFrame。
  3. 取出accuracy和val_accuracy两列。
  4. 使用DataFrame的plot()方法绘制这两列的曲线图。

也就是说,这段代码提取出模型在训练集和验证集上的accuracy曲线,并绘制其变化趋势图。

通过图形可以直观地查看模型的accuracy在训练过程中是如何变化的:

  • accuracy反映模型对训练集的拟合能力。
  • val_accuracy反映模型对验证集的泛化能力。
  • 如果两者趋势相近,说明模型没有过拟合。
  • 如果accuracy持续上升而val_accuracy趋于饱和,则说明模型过拟合。

通过绘制accuracy和val_accuracy对比趋势图,可以直观判断模型的训练情况和泛化能力,提供模型评估和调优的依据。这是Keras中常用的模型分析技巧之一。

### 11.

Y_predict = model.predict(X_test)

Y_pred = Y_predict.argmax(axis=-1)

Y_test = Y_test.argmax(axis = -1 )

report = classification_report(Y_test, Y_pred)

print(report)

这段代码使用Keras模型在测试集上进行预测,并计算分类报告。

主要步骤:

  1. 在测试集X_test上进行预测,保存在Y_predict中。
  2. 对多分类问题取预测概率最大的类别,保存在Y_pred中。
  3. 对真实标签也取类别值,保存在Y_test中。
  4. 使用sklearn的classification_report比较Y_pred和Y_test。
  5. 打印报告。

classification_report会输出精确率、召回率、F1分数等信息,用于评估分类模型的预测质量。

         precision    recall  f1-score   support

     0       0.xx      0.xx      0.xx        xx
     1       0.xx      0.xx      0.xx        xx

accuracy                           0.xx       xxx

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值