网站建设 教案电子商务网站建设与完整实例

张小明 2026/1/19 14:04:06
网站建设 教案,电子商务网站建设与完整实例,网站开发与设计.net,有经验的聊城网站建设原文#xff1a;towardsdatascience.com/how-to-handle-imbalanced-datasets-in-machine-learning-projects-a95fa2cd491a 想象一下#xff0c;你已经训练了一个准确率高达 0.9 的预测模型。像精确度、召回率和 f1 分数这样的评估指标也看起来很有希望。但你的经验和直觉告诉…原文towardsdatascience.com/how-to-handle-imbalanced-datasets-in-machine-learning-projects-a95fa2cd491a想象一下你已经训练了一个准确率高达 0.9 的预测模型。像精确度、召回率和 f1 分数这样的评估指标也看起来很有希望。但你的经验和直觉告诉你事情并不对劲所以你进行了进一步的调查并发现了以下情况https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1054c96b3e3bc64e1949fcfe7d69dd68.pngImage_1 – 作者截图模型的看似强大的性能是由其目标变量中的多数类0驱动的。由于多数类和少数类之间明显的不平衡模型在预测多数类0方面表现出色而少数类1的性能则远未令人满意。然而由于类1只代表了目标变量的一小部分其性能对整体评估指标的总体得分影响很小这给你造成了一种模型强大的错觉。这并不是一个罕见的情况。相反数据科学家在现实世界的项目中经常遇到不平衡的数据集。不平衡数据集指的是类别或类别在数据集中没有平等代表的情况。我们不应该忽略数据集中的不平衡因为它可能导致模型性能偏差、泛化能力差和误导性的评估指标问题。本文将讨论解决不平衡数据集带来的挑战的技术。为了演示目的我将继续使用我在另一篇文章中使用过的 UCI 机器学习仓库中的银行营销数据集。你可以在这里检查有关数据集的所有信息并下载数据这里。这个数据集受 Creative Commons Attribution 4.0 International (CC BY 4.0)许可协议的许可允许用于任何目的的共享和改编前提是给予适当的信用。银行营销数据集包含 16 个特征和一个二元目标变量该变量表示客户是否订阅了定期存款。目标变量高度不平衡其多数类0占总数据的 88.3%而少数类1占 11.7%。如果我们不处理数据集中的不平衡我们可以简单地使用下面的脚本训练一个预测模型来预测客户是否会订阅定期存款评估指标在本文开头 Image_1 中展示。# Import librariesimportpandasaspdimportnumpyasnpimportioimportrequestsfromzipfileimportZipFilefromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportOneHotEncoder,StandardScalerfromsklearn.ensembleimportRandomForestClassifierfromsklearn.metricsimportaccuracy_score,classification_report,roc_auc_score,roc_curveimportmatplotlib.pyplotasplt# Download the dataurlhttps://archive.ics.uci.edu/static/public/222/bankmarketing.zipresponserequests.get(url)# Open the datasetwithZipFile(io.BytesIO(response.content))asouter_zip:withouter_zip.open(bank.zip)asinner_zip_file:withZipFile(io.BytesIO(inner_zip_file.read()))asinner_zip:withinner_zip.open(bank-full.csv)ascsv_file:dfpd.read_csv(csv_file,sep;)# Initial EDA:# Check for missing values and basic statsprint(df.isnull().sum())# No missing values in this dataset# Drop columns day and monthdfdf.drop(columns[day,month])# Loop One-Hot Encoding for categorical columnscategorical_columns[job,marital,education,default,housing,loan,contact,poutcome]encoderOneHotEncoder(dropfirst,sparseFalse)forcolumnincategorical_columns:encoded_colsencoder.fit_transform(df[[column]])encoded_dfpd.DataFrame(encoded_cols,columns[f{column}_{cat}forcatinencoder.categories_[0][1:]])dfpd.concat([df.drop(columns[column]),encoded_df],axis1)# Separate features (X) and the target variable (y)Xdf.drop(y,axis1)# y is the target variableydf[y].apply(lambdax:1ifxyeselse0)# Convert target to binary# Split the data into training and testing sets without using SMOTEX_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.3,random_state42)# Standardizing numerical featuresscalerStandardScaler()numerical_columnsX_train.select_dtypes(include[int64,float64]).columnsforcolumninnumerical_columns:X_train[column]scaler.fit_transform(X_train[[column]])X_test[column]scaler.transform(X_test[[column]])# Train the RandomForestClassifier without any method to handle imbalancerfRandomForestClassifier(n_estimators100,random_state42,class_weightNone)rf.fit(X_train,y_train)# Make predictionsy_predrf.predict(X_test)y_pred_probarf.predict_proba(X_test)[:,1]# Evaluation metricsaccuracyaccuracy_score(y_test,y_pred)classification_repclassification_report(y_test,y_pred)roc_aucroc_auc_score(y_test,y_pred_proba)# Print evaluation resultsprint(fAccuracy:{accuracy})print(Classification Report:)print(classification_rep)print(fROC-AUC:{roc_auc})在接下来的章节中我将介绍处理不平衡数据集最常用的方法并将几种合适的技巧应用于这个银行营销数据集。处理不平衡数据集的常用方法随机欠采样随机欠采样是一种从多数类中移除样本以平衡类别分布的方法。它通常在多数类显著较大且开发者可以承受因数据减少而丢失一些信息时使用。优点简单且减少了训练时间。缺点可能会移除重要信息并导致欠拟合。Python 示例fromimblearn.under_samplingimportRandomUnderSamplerfromcollectionsimportCounterfromsklearn.datasetsimportmake_classification# Create a mock imbalanced datasetX,ymake_classification(n_classes2,weights[0.99,0.01],n_samples1000,random_state42)print(Original class distribution:,Counter(y))# Apply random undersamplingrusRandomUnderSampler(random_state42)X_res,y_resrus.fit_resample(X,y)print(Resampled class distribution:,Counter(y_res))随机过采样与随机欠采样相反随机过采样通过复制少数类的样本来平衡数据集。它通常在数据有限开发者希望在解决不平衡的同时保留所有样本时使用。优点保留了所有原始样本。缺点可能会通过重复相同的信息导致过拟合。Python 示例fromimblearn.over_samplingimportRandomOverSampler# Apply random oversamplingrosRandomOverSampler(random_state42)X_res,y_resros.fit_resample(X,y)print(Resampled class distribution:,Counter(y_res))SMOTE合成少数过采样技术SMOTE通过在现有样本之间插值来为少数类生成合成样本。SMOTE 与随机过采样ROS的关键区别在于ROS 只是简单地复制数据点而不引入任何新信息这可能导致过拟合而 SMOTE 生成新的合成样本与随机复制相比降低了过拟合的风险。优点比随机过采样更稳健且不太容易过拟合。缺点如果生成的样本不具有代表性可能会引入噪声。Python 示例fromimblearn.over_samplingimportSMOTE# Apply SMOTEsmoteSMOTE(random_state42)X_smote,y_smotesmote.fit_resample(X,y)print(SMOTE class distribution:,Counter(y_smote))成本敏感学习成本敏感学习是一种通过为每个类别分配不同的成本来直接调整模型的方法而不是引入重采样技术来改变原始数据集。这种方法通常在少数类更重要时使用例如欺诈检测、医疗诊断。优点无需修改数据。缺点需要仔细调整成本参数。Python 示例fromsklearn.treeimportDecisionTreeClassifierfromsklearn.metricsimportclassification_report# Train a cost-sensitive decision treemodelDecisionTreeClassifier(class_weight{0:1,1:10},random_state42)model.fit(X,y)# Evaluate the modely_predmodel.predict(X)print(classification_report(y,y_pred))平衡随机森林平衡随机森林是一种将随机森林与类别的平衡采样相结合的方法。这种方法使开发者能够构建一个稳健的模型并避免欠拟合。优点在平衡数据集的同时保持模型复杂性。缺点计算密集。Python 示例fromimblearn.ensembleimportBalancedRandomForestClassifierfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score# Split the dataX_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.3,random_state42)# Train a Balanced Random Forest modelbrfBalancedRandomForestClassifier(random_state42)brf.fit(X_train,y_train)# Evaluatey_predbrf.predict(X_test)print(Balanced Random Forest Accuracy:,accuracy_score(y_test,y_pred))解决银行营销数据不平衡问题为了解决本文开头提到的银行营销数据不平衡问题我应用了包括 SMOTE、ADASYN、平衡随机森林BRF和成本敏感学习等技术。然后我选择了 BRF因为它将 f1-score 从 0.45 提高到 0.52并且这种改进在所有方法中是最显著的。此外BRF 是一种集成方法它内部平衡类别这使得该方法适合这个银行营销数据集。通过使用 BRF我们不必过于担心过拟合或欠拟合的问题因为这是一个稳健的方法。# Import librariesimportpandasaspdimportnumpyasnpimportioimportrequestsfromzipfileimportZipFilefromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportOneHotEncoder,StandardScalerfromimblearn.ensembleimportBalancedRandomForestClassifier# Import BRFfromsklearn.feature_selectionimportSelectFromModelimportmatplotlib.pyplotaspltfromsklearn.metricsimportaccuracy_score,roc_auc_score,precision_score,recall_score,f1_score,classification_report# Download the dataurlhttps://archive.ics.uci.edu/static/public/222/bankmarketing.zipresponserequests.get(url)# Open the datasetwithZipFile(io.BytesIO(response.content))asouter_zip:withouter_zip.open(bank.zip)asinner_zip_file:withZipFile(io.BytesIO(inner_zip_file.read()))asinner_zip:withinner_zip.open(bank-full.csv)ascsv_file:dfpd.read_csv(csv_file,sep;)# Initial EDA:# Check for missing values and basic statsprint(df.isnull().sum())# No missing values in this dataset# Drop columns day and monthdfdf.drop(columns[day,month])# Loop One-Hot Encoding for categorical columnscategorical_columns[job,marital,education,default,housing,loan,contact,poutcome]encoderOneHotEncoder(dropfirst,sparse_outputFalse)forcolumnincategorical_columns:encoded_colsencoder.fit_transform(df[[column]])encoded_dfpd.DataFrame(encoded_cols,columns[f{column}_{cat}forcatinencoder.categories_[0][1:]])dfpd.concat([df.drop(columns[column]),encoded_df],axis1)# Separate features (X) and the target variable (y)Xdf.drop(y,axis1)# y is the target variableydf[y].apply(lambdax:1ifxyeselse0)# Convert target to binary# Split the data into training and testing setsX_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.3,random_state42)# Standardizing numerical featuresscalerStandardScaler()numerical_columnsX_train.select_dtypes(include[int64,float64]).columns X_train[numerical_columns]scaler.fit_transform(X_train[numerical_columns])X_test[numerical_columns]scaler.transform(X_test[numerical_columns])# Feature Selection using BalancedRandomForestClassifierselectorBalancedRandomForestClassifier(n_estimators100,random_state42)selector.fit(X_train,y_train)modelSelectFromModel(selector,thresholdmedian,prefitTrue)selected_maskmodel.get_support()selected_columnsX_train.columns[selected_mask]X_train_selectedmodel.transform(X_train)X_test_selectedmodel.transform(X_test)# Visualize feature importance of the selected featuresimportancesselector.feature_importances_ selected_importancesimportances[selected_mask]indicesnp.argsort(selected_importances)[::-1]selected_names_sorted[selected_columns[i]foriinindices]plt.figure(figsize(12,8))plt.title(Feature Importance of Selected Features)plt.barh(range(len(selected_importances)),selected_importances[indices])plt.yticks(range(len(selected_importances)),selected_names_sorted)plt.xlabel(Relative Importance)plt.gca().invert_yaxis()plt.show()# Define parameter grid for BalancedRandomForestn_estimators_options[50,100]max_depth_options[10,20,30]best_f1_score0best_accuracy0best_params{}best_classification_reportbest_brfNone# Nested loop to iterate through hyperparametersforn_estimatorsinn_estimators_options:formax_depthinmax_depth_options:brfBalancedRandomForestClassifier(n_estimatorsn_estimators,max_depthmax_depth,random_state42)brf.fit(X_train_selected,y_train)# Make predictions on the test sety_predbrf.predict(X_test_selected)# Calculate performance metrics for the test setaccuracyaccuracy_score(y_test,y_pred)f1f1_score(y_test,y_pred,averageweighted)# If current model has better F1-score, update best model detailsiff1best_f1_scoreor(f1best_f1_scoreandaccuracybest_accuracy):best_f1_scoref1 best_accuracyaccuracy best_params{n_estimators:n_estimators,max_depth:max_depth}best_classification_reportclassification_report(y_test,y_pred)best_brfbrf# Store the best model# Print the best model performance and hyperparametersprint(fnBest F1 Score:{best_f1_score:.4f})print(fBest Accuracy:{best_accuracy:.4f})print(fBest Parameters:{best_params})# Print the classification report of the best modelprint(nClassification Report for the Best Model:n)print(best_classification_report)# Check for overfittingy_train_predbest_brf.predict(X_train_selected)# Calculate metrics on the training settrain_accuracyaccuracy_score(y_train,y_train_pred)train_f1f1_score(y_train,y_train_pred,averageweighted)print(nTraining Set Performance:)print(fAccuracy:{train_accuracy:.4f})print(fF1 Score:{train_f1:.4f})print(nTest Set Performance:)print(fAccuracy:{best_accuracy:.4f})print(fF1 Score:{best_f1_score:.4f})# Simple overfitting checkiftrain_accuracybest_accuracy0.05:print(nOverfitting Detected: The model performs significantly better on the training set.)else:print(nNo significant overfitting detected.)输出结果https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/82c825f5ee2a26f4d8f5e12f5bf6b3b7.png作者截图结论这个选择是一个完美的解决方案吗尽管 BRF 将少数类的召回率从 0.36 提高到 0.86将 F1 分数从 0.45 提高到 0.52但我们看到了精确度的下降。这意味着解决方案不成功吗不一定。处理不平衡数据集的技术效果取决于以下因素不平衡程度不平衡程度越严重这些方法做出显著改进就越困难。模型适应性如果模型未能捕捉到所有潜在的规律它们可能无法充分利用处理不平衡数据的技巧。评估指标在特定应用中某些指标的微小提升可以被认为是显著的。对于这个银行营销数据集将少数类的 F1 分数从 0.45 提高到 0.52 是一个显著的提升。由于平衡随机森林确保每棵树都能获得数据的平衡视图它提高了模型从少数类学习的能力。尽管增加的误报可能会导致更高的营销成本但显著提高的召回分数可以带来更好的转化机会、提高的营销效率和甚至更大的客户参与度。因此认识到精确度和召回率之间的权衡非常重要在这个特定情况下提高的 F1 分数是有合理依据的。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

重庆白云seo整站优化什么样的网站做百度广告好

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个面向初学者的Java文件转换示例:1. 图文解释File和MultipartFile的区别 2. 分步实现最简单的转换方法 3. 提供可运行的main方法示例 4. 常见错误排查指南。要求…

张小明 2026/1/17 22:40:49 网站建设

如何建立本地网站新冠流行最新消息

摘要:谷歌最新发布的Gemini3Pro和NanoBananaPro在多模态能力上表现惊艳,但直接使用海外大模型面临注册繁琐、成本高昂等问题。文章介绍了AiOnly这一MaaS服务平台,它整合了80国内外大模型,提供一键调用、按量计费等便捷功能。通过F…

张小明 2026/1/17 22:40:50 网站建设

网站模版源代码校园网站界面建设

OnmyojiAutoScript 终极指南:阴阳师自动化脚本完整解析 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 阴阳师作为一款深受玩家喜爱的卡牌游戏,其丰富的游…

张小明 2026/1/17 22:40:50 网站建设

两学一做网上答题网站江苏泰州海陵区建设局网站

PCILeech是一款专业的直接内存访问(DMA)软件,作为强大的内存取证技术和系统调试工具,它能够通过PCIe硬件设备直接读取和写入目标系统的内存,无需在目标系统上安装任何驱动程序。这款工具为安全研究、系统调试和内存分析…

张小明 2026/1/17 22:40:55 网站建设

网站建设浦东成都seo招聘

Bongo Cat终极选择指南:三大模型对比帮你找到最佳桌面伙伴 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作,每一次输入都充满趣味与活力! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 在漫…

张小明 2026/1/17 22:40:54 网站建设

创网中国的网站合肥做双语网站

在 Bash 脚本编程与日常命令行操作中,“替换机制”是提升效率、拓展功能的核心特性之一。它允许将命令的执行结果、进程的 I/O 流等动态内容嵌入到命令行或脚本中,实现“动态内容注入”的效果。其中,命令替换(Command Substitutio…

张小明 2026/1/17 22:40:54 网站建设