企业网站建设费用怎么核算,软件开发流程图怎么做,网站建设费开票收候开在哪个类别里,大连做网站优化文章目录 一、什么是下采样方法#xff1f;二、通过下采样方法实现银行贷款分类问题三、下采样的优缺点 一、什么是下采样方法#xff1f;
机器学习中的下采样#xff08;Undersampling#xff09;方法是一种处理不平衡数据集的有效手段#xff0c;特别是在数据集中某些类… 文章目录 一、什么是下采样方法二、通过下采样方法实现银行贷款分类问题三、下采样的优缺点 一、什么是下采样方法
机器学习中的下采样Undersampling方法是一种处理不平衡数据集的有效手段特别是在数据集中某些类别的样本数量明显多于其他类别时。下采样的主要目的是通过减少多数类样本的数量来平衡数据分布从而提高模型的泛化能力和准确性。
二、通过下采样方法实现银行贷款分类问题
具体步骤 1、读取并查看数据2、数据标准化3、下采样解决样本不均衡问题4、划分数据集5、训练模型并建立最优模型6、传入测试数据集进行测试 1、读取并查看数据 这里有一份含有**28万**数据的csv文件 通过pandas方法读取此文件 # 通过pandas方法读取creditcard.csv文件并用data变量接收
data pd.read_csv(creditcard.csv)
data.head() # 查看data的前几行默认是5行如下图所示 这个数据的最后一列“Class”标签用来标注是否正常0表示正常1表示异常 我们可以通过画出条形图来观察两类标签的样本个数 import matplotlib.pyplot as plt
绘制条形图查看正负样本个数
labels_count pd.value_counts(data[Class])
plt.title(正负例样本数)
plt.xlabel(类别)
plt.ylabel(帧数)
labels_count.plot(kindbar)
plt.show()结果如下 可以看出0和1标签的样本数据个数相差的非常多0标签有28万而1标签只有几百多这便是不平衡数据集 2、数据标准化 我们数据的倒数第二Amount列可以看出这一列的特征数值比其他列特征数值要大很多如果不做调整就传入模型训练将会占有很大的权重导致最后的结果很大的程度上都只受这一个特征的影响通过观察可以发现前面的特征数据都是在-1~1之间所以我们可以用Z标准化的方法改变其数值范围from sklearn.preprocessing import StandardScaler
数据标准化Z标准化
scaler StandardScaler()
# a data[[Amount]] # 返回dataframe数据而不是series
# 用StandardScaler中的fit_transform实现Z标准化
data[Amount] scaler.fit_transform(data[[Amount]])结果如下 3、下采样解决样本不均衡问题 通过随机抽取0特征标签中的数据与1特征标签数量相同并将两个特征拼接为一个新的数据集 # 数据的第一列Time没有作用,删除
data data.drop([Time], axis1) # 删除无用列下采样解决样本不均衡问题
positive_eg data[data[Class] 0] # 获取所有标签(Class)为0的数据
negative_eg data[data[Class] 1] # 获取所有标签(Class)为1的数据
np.random.seed(seed3) # 随机种子保证每次执行这个代码随机抽选的结果都是一样
#
positive_eg positive_eg.sample(len(negative_eg)) # sample 表示随机从参数里面选择数据并和1标签的数据数量相同
# 拼接数据
data_c pd.concat([positive_eg, negative_eg]) # 把两个pandas数据组合为一个可以再次通过绘制条形图观察数据 labels_count pd.value_counts(data_c[Class])
plt.title(正负例样本数)
plt.xlabel(类别)
plt.ylabel(帧数)
labels_count.plot(kindbar)
plt.show()结果如下 4、划分数据集 这里我们划分两类数据集一类是经过下采样处理后形成的小部分数据集另一类是划分原始数据集划分下采样后的数据集用于模型训练划分原数据集最后传入模型预测出结果观察模型的性能是否有所提高from sklearn.model_selection import train_test_split
# 对下采样数据划分
x_s data_c.drop(Class, axis1) # 去除标签列作为训练数据
y_s data_c.Class # 得到标签列
# 划分出30%的测试集并抛出随机种子为了后面每次的运行随机划分的都是相同的数据
x_s_train, x_s_test, y_s_train, y_s_test train_test_split(x_s, y_s, test_size0.3, random_state0)# 对原数据划分
x data.drop(Class, axis1)
y data.Class
x_train, x_test, y_train, y_test train_test_split(x, y, test_size0.3, random_state0)5、训练模型并建立最优模型 交叉验证选择较优惩罚因子 建立最优模型 # 交叉验证选择较优惩罚因子
scores []
c_param_range [0.01, 0.1, 1, 10, 100] # 参数
for i in c_param_range: # 第1次循环的时候C0.01,5个逻辑回归模型lr LogisticRegression(Ci, penaltyl2, solverlbfgs, max_iter1000)score cross_val_score(lr, x_s_train, y_s_train, cv8, scoringrecall) # 交叉验证score_mean sum(score) / len(score) # 交叉验证后的值 召回率scores.append(score_mean) # 存放所有的交叉验证召回率print(score_mean) # 将不同的C参数分别传入模型 分别看看哪个模型效果更好best_c c_param_range[np.argmax(scores)] # 找到scores中最大的值对应的C参数
print(........最优惩罚因子为{}.........format(best_c))建立最优模型
lr LogisticRegression(Cbest_c, penaltyl2, max_iter1000)
lr.fit(x_s_train, y_s_train)运行结果为 6、传入测试数据集进行测试 predict 方法接受一个数组或类似数组的结构如列表的列表、Pandas DataFrame等其中包含了要预测的目标变量的新数据点。然后它使用训练好的模型对这些数据点进行预测并返回一个包含预测结果的数组。 metrics.classification_report 是 scikit-learn一个流行的 Python 机器学习库中的一个函数用于展示主要分类指标的文本报告。这个函数特别适用于评估分类模型的性能尤其是在处理多类分类问题时。它提供了每个类别的精确度precision、召回率recall、F1 分数F1-score和支持度support即每个类别的真实样本数量的详细报告。 from sklearn import metrics# 传入下采样后的测试数据
test_s_predicted lr.predict(x_s_test)
print(metrics.classification_report(y_s_test, test_s_predicted))# 传入原数据的测试数据
test_predicted lr.predict(x_test)
print(metrics.classification_report(y_test, test_predicted)) 结果如下 下面是未使用下采样方法使用原数据进行模型训练后的结果 对比两次不同数据训练出的结果可以看出通过下采样的方法处理数据后可以大大提高模型的性能
三、下采样的优缺点
优点 提升分类器准确率通过减少多数类样本的数量使得数据集中不同类别的样本数量更加均衡从而有助于提升分类器对少数类样本的识别能力进而提升整体分类准确率。降低训练时间由于数据集的大小减少模型的训练时间也会相应缩短。降低过拟合风险减少多数类样本的数量可以降低模型对多数类样本的过度拟合提高模型的泛化能力。 缺点 降低数据集代表性随机欠采样可能会剔除一些重要的多数类样本导致数据集的代表性降低。这可能会影响模型的性能特别是当被剔除的样本包含对分类任务至关重要的信息时。信息损失由于剔除了部分多数类样本数据集中的信息量也会相应减少。这可能会导致模型在训练过程中无法充分学习到多数类的特征分布从而影响模型的性能。