✨ 欢迎关注Python机器学习AI ✨
本节介绍:基于自动机器学习的预测模型构建及其残差和部分依赖分析,数据采用模拟数据无任何现实意义 ,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。文末提供高效的AI工具~!
✨ 论文信息 ✨
文章利用自动化机器学习模型预测构建湿地中再生水的总氮浓度,并精确调控锰离子的投加方法,作者为群友整合公众号往期文章进行部分实现
流程图展示机器学习框架的整体步骤:首先收集数据,并进行数据预处理,包括特征工程、特征提取和特征相关性分析,将总数据集分为训练集(90%-50%)和测试集(10%-50%),使用训练集进行模型训练,并使用测试集进行模型评估(这里主要是判断不同比例的数据分割对模型性能的影响,一般而言不会做这一步默认采取常规的2:8或者3:7比例),评估模型在不同训练时间(如15s、30s等)下的表现,并使用多种性能指标(如MAE、RMSE、R²)来评估最终模型的效果,最终针对最优模型通过残差分析和部分依赖分析,解释模型的预测结果,并确定最终的最佳模型
图表展示Flaml、AutoML H₂O和AutoGluon三个自动化机器学习模型框架在不同数据集划分比率下的表现,包括R²值、实际与预测的TN浓度对比以及各自的MAE和RMSE指标,模型在不同划分比率下的预测精度(这里对比的训练时间为60s),可以发现 Flaml框架下划分比例为2:8模型性能是最高的,接下来复现也主要是针对 Flaml框架进行复现
在不同训练时间下,Flaml模型的预测精度随着训练时间的增加并不一定有所提高,其中90秒的训练时间获得了最佳表现,具有最高的R²值(0.9833)和最低的MAE与RMSE
进一步的模 型评估通过残差分析和部分依赖分析来确保模型的预测性能和稳定性,结果表明优化后的Flaml模型有效提取了再生湿地中相关的生物化学过程信息
✨ 基础代码 ✨
# 导入必要的库
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.inspection import PartialDependenceDisplay
import matplotlib.pyplot as plt
def read_data(file):
data = pd.read_excel(file,0) # 0这个数意思是让读取excel表格的sheet1
data = data.iloc[:,:]
return data
file = '2025-9-15公众号Python机器学习AI.xlsx'
data = read_data(file)
data_train = pd.DataFrame(data, columns=data.columns)
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
cols = X.columns
X
代码通过读取一个Excel文件中的数据,并将其划分为特征变量(X)和目标变量(y),为使用模拟数据构建和训练机器学习模型(如随机森林回归器)做好准备
from scipy.cluster.hierarchy import linkage, dendrogram
plt.rcParams['font.serif'] = ['Times New Roman']
# 创建相关性矩阵
corr = data.corr()
# 使用欧几里得距离和沃德方法进行层次聚类
Z = linkage(corr1, method='ward')
# 绘制树状图
plt.figure(dpi = 600,figsize=(12, 8))
dendrogram(Z,labels=corr1.index,leaf_rotation=90, leaf_font_size=10)
plt.title('Hierarchical Clustering',fontsize=20)
plt.ylabel('Distance',fontsize=20)
# 设置刻度标签字体大小(并旋转 X 轴刻度)
plt.xticks(rotation=45, fontsize=18) # X 轴刻度字体设为 14
plt.yticks(fontsize=18) # Y 轴刻度字体设为 14
plt.savefig("Hierarchical Clustering.png")
plt.show()
计算数据的相关性矩阵,使用欧几里得距离和沃德方法进行层次聚类,并绘制一个树状图,展示不同特征之间的聚类关系
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score, KFold
from sklearn.model_selection import KFold
from sklearn.metrics import r2_score,mean_absolute_error,mean_squared_error
kf = KFold(n_splits=5, shuffle=True, random_state=0)
RF_model = RandomForestRegressor(max_depth=11, n_estimators=30, max_features=6, min_samples_leaf=3, min_samples_split=4)
feature_importance = RF_model.feature_importances_
feature_importance_index = ['infP', 'infC', 'infAc', 'infpro', 'infS', 'MLSS', 'MLVSS', 'VSS/TSS',
'volumn', 'ana-time', 'pH', 'T', 'salinity']
ranking_importance = pd.DataFrame({'Feature': feature_importance_index, 'importance': feature_importance})
ranking_importance = ranking_importance.sort_values(by='importance')
ranking_importance = ranking_importance.sort_values(by='importance', ascending=False)
plt.rcParams['font.serif'] = ['Times New Roman']
# 绘制特征重要性图
plt.figure(figsize=(7, 6))
sns.barplot(x='importance', y='Feature', data=ranking_importance,color='skyblue')
plt.title('Feature Importance')
plt.xlabel('Importance')
plt.ylabel('Feature')
plt.savefig("Feature importances1",dpi=900)
plt.show()
使用随机森林回归模型训练数据,计算各特征的重要性,并绘制特征重要性的条形图,展示哪些特征对模型的预测结果影响最大,在文献中这部分用于 模型开发前的输入特征选择:皮尔逊相关系数用于检查任意两个输入特征之间的关联,分层聚类:基于实验条件对特征进行聚类。在进行聚类时,考虑了实验的条件,并确保同一聚类内的不同经验类别特征不被删除,特征排列重要性:通过基于随机森林模型的特征排列重要性分析,量化每个特征对目标预测的相对影响,这对于最终的特征选择至关重要,具体读者可以阅读文献进行了解,对于这里的模拟数据并没有进行特征的剔除
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.9, test_size=0.1,random_state = 42)
from flaml import AutoML
automl_settings = {
"time_budget": 60, # in seconds
"metric": "rmse",
"task": "regression",
"split_type": 'auto', # 使用 K 折交叉验证
"n_splits": 5 # 5 折交叉验证
}
automl = AutoML()
automl.fit(X_train, y_train,**automl_settings)
# 预测测试集
y_train_pred = automl.predict(X_train)
y_pred = automl.predict(X_test)
使用FLAML的AutoML工具对数据进行自动化机器学习建模,进行回归任务,并在训练集和测试集上进行预测,评估模型的性能
[flaml.automl.logger: 09-15 20:29:07] {1752} INFO - task = regression
[flaml.automl.logger: 09-15 20:29:07] {1763} INFO - Evaluation method: cv
[flaml.automl.logger: 09-15 20:29:07] {1862} INFO - Minimizing error metric: rmse
[flaml.automl.logger: 09-15 20:29:09] {1979} INFO - List of ML learners in AutoML Run: ['lgbm', 'rf', 'xgboost', 'extra_tree', 'xgb_limitdepth', 'sgd', 'catboost']
[flaml.automl.logger: 09-15 20:29:09] {2282} INFO - iteration 0, current learner lgbm
[flaml.automl.logger: 09-15 20:29:09] {2417} INFO - Estimated sufficient time budget=801s. Estimated necessary time budget=7s.
[flaml.automl.logger: 09-15 20:29:09] {2466} INFO - at 1.8s, estimator lgbm's best error=21.5419, best estimator lgbm's best error=21.5419
[flaml.automl.logger: 09-15 20:29:09] {2282} INFO - iteration 1, current learner lgbm
......
[flaml.automl.logger: 09-15 20:30:07] {2724} INFO - retrain xgb_limitdepth for 0.0s
[flaml.automl.logger: 09-15 20:30:07] {2727} INFO - retrained model: XGBRegressor(base_score=None, booster=None, callbacks=[], colsample_bylevel=1.0,
colsample_bynode=None, colsample_bytree=1.0, device=None,
early_stopping_rounds=None, enable_categorical=False,
eval_metric=None, feature_types=None, gamma=None, grow_policy=None,
importance_type=None, interaction_constraints=None,
learning_rate=0.2461852366690383, max_bin=None,
max_cat_threshold=None, max_cat_to_onehot=None,
max_delta_step=None, max_depth=5, max_leaves=None,
min_child_weight=2.8268358531668594, missing=nan,
monotone_constraints=None, multi_strategy=None, n_estimators=14,
n_jobs=-1, num_parallel_tree=None, random_state=None, ...)
[flaml.automl.logger: 09-15 20:30:07] {2009} INFO - fit succeeded
[flaml.automl.logger: 09-15 20:30:07] {2010} INFO - Time taken to find the best model: 57.3146550655365
这是AutoML自动处理从模型选择到优化的全过程输出,用户不需要手动干预或选择具体的模型
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np
# 计算不同的性能指标
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
# 打印性能指标
print(f'测试集Mean Absolute Error (MAE): {mae}')
print(f'测试集Mean Squared Error (MSE): {mse}')
print(f'测试集Root Mean Squared Error (RMSE): {rmse}')
print(f'测试集R-squared (R2): {r2}')
print(f'-------------------------')
# 计算不同的性能指标
mae = mean_absolute_error(y_train, y_train_pred)
mse = mean_squared_error(y_train, y_train_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_train, y_train_pred)
# 打印性能指标
print(f'训练集Mean Absolute Error (MAE): {mae}')
print(f'训练集Mean Squared Error (MSE): {mse}')
print(f'训练集Root Mean Squared Error (RMSE): {rmse}')
print(f'训练集R-squared (R2): {r2}')
# 获取最佳模型
best_model = automl.model.estimator
# 打印最佳模型的信息
print(f'Best Model: {best_model}')
计算并打印测试集和训练集的主要回归性能指标(MAE、MSE、RMSE、R²),然后输出AutoML模型的最佳估算器信息
测试集Mean Absolute Error (MAE): 8.080109959329876
测试集Mean Squared Error (MSE): 108.03600596650404
测试集Root Mean Squared Error (RMSE): 10.39403703892304
测试集R-squared (R2): 0.8698863156985128
-------------------------
训练集Mean Absolute Error (MAE): 3.832509431425002
训练集Mean Squared Error (MSE): 29.818172988875183
训练集Root Mean Squared Error (RMSE): 5.460601888883238
训练集R-squared (R2): 0.9633513790035111
Best Model: XGBRegressor(base_score=None, booster=None, callbacks=[], colsample_bylevel=1.0,
colsample_bynode=None, colsample_bytree=1.0, device=None,
early_stopping_rounds=None, enable_categorical=False,
eval_metric=None, feature_types=None, gamma=None, grow_policy=None,
importance_type=None, interaction_constraints=None,
learning_rate=0.2461852366690383, max_bin=None,
max_cat_threshold=None, max_cat_to_onehot=None,
max_delta_step=None, max_depth=5, max_leaves=None,
min_child_weight=2.8268358531668594, missing=nan,
monotone_constraints=None, multi_strategy=None, n_estimators=14,
n_jobs=-1, num_parallel_tree=None, random_state=None, ...)
结果显示模型在测试集和训练集上的性能表现,其中测试集的R²为0.87,训练集的R²为0.96,表明模型在训练集上的拟合较好,但在测试集上有一定的误差;最终选择的最佳模型是XGBRegressor,它的超参数和训练细节也被列出,这是划分比例为1;9
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, test_size=0.2,random_state = 42)
from flaml import AutoML
automl_settings = {
"time_budget": 15, # in seconds
"metric": "rmse",
"task": "regression",
"split_type": 'auto', # 使用 K 折交叉验证
"n_splits": 5 # 5 折交叉验证
}
automl = AutoML()
automl.fit(X_train, y_train,**automl_settings)
# 预测测试集
y_train_pred = automl.predict(X_train)
y_pred = automl.predict(X_test)
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np
# 计算不同的性能指标
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
# 打印性能指标
print(f'测试集Mean Absolute Error (MAE): {mae}')
print(f'测试集Mean Squared Error (MSE): {mse}')
print(f'测试集Root Mean Squared Error (RMSE): {rmse}')
print(f'测试集R-squared (R2): {r2}')
print(f'-------------------------')
# 计算不同的性能指标
mae = mean_absolute_error(y_train, y_train_pred)
mse = mean_squared_error(y_train, y_train_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_train, y_train_pred)
# 打印性能指标
print(f'训练集Mean Absolute Error (MAE): {mae}')
print(f'训练集Mean Squared Error (MSE): {mse}')
print(f'训练集Root Mean Squared Error (RMSE): {rmse}')
print(f'训练集R-squared (R2): {r2}')
# 获取最佳模型
best_model = automl.model.estimator
# 打印最佳模型的信息
print(f'Best Model: {best_model}')
使用AutoML进行回归模型训练,重点在于设置time_budget=15秒,限制训练时间,并在训练集和测试集上评估模型性能,最终输出最佳模型的信息,为了以高效的计算方式选择最终的高性能模型进行后续可解释性分析,通过设置不同的Flaml搜索过程时间预算进行了实验。这个时间预算作为一个实用的超参数,约束了搜索最优模型和超参数的持续时间,而不是作为单个模型的基本训练参数
测试集Mean Absolute Error (MAE): 7.397615151313552
测试集Mean Squared Error (MSE): 101.44100619696351
测试集Root Mean Squared Error (RMSE): 10.07179260097047
测试集R-squared (R2): 0.8772094761495342
-------------------------
训练集Mean Absolute Error (MAE): 3.9272918371754604
训练集Mean Squared Error (MSE): 28.775896803825596
训练集Root Mean Squared Error (RMSE): 5.364316993227153
训练集R-squared (R2): 0.9646566270660979
Best Model: ExtraTreesRegressor(max_features=0.6490475444011059, max_leaf_nodes=80,
n_estimators=9, n_jobs=-1, random_state=12032022)
from flaml import AutoML
automl_settings = {
"time_budget": 30, # in seconds
"metric": "rmse",
"task": "regression",
"split_type": 'auto', # 使用 K 折交叉验证
"n_splits": 5 # 5 折交叉验证
}
automl = AutoML()
automl.fit(X_train, y_train,**automl_settings)
# 预测测试集
y_train_pred = automl.predict(X_train)
y_pred = automl.predict(X_test)
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np
# 计算不同的性能指标
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
# 打印性能指标
print(f'测试集Mean Absolute Error (MAE): {mae}')
print(f'测试集Mean Squared Error (MSE): {mse}')
print(f'测试集Root Mean Squared Error (RMSE): {rmse}')
print(f'测试集R-squared (R2): {r2}')
print(f'-------------------------')
# 计算不同的性能指标
mae = mean_absolute_error(y_train, y_train_pred)
mse = mean_squared_error(y_train, y_train_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_train, y_train_pred)
# 打印性能指标
print(f'训练集Mean Absolute Error (MAE): {mae}')
print(f'训练集Mean Squared Error (MSE): {mse}')
print(f'训练集Root Mean Squared Error (RMSE): {rmse}')
print(f'训练集R-squared (R2): {r2}')
# 获取最佳模型
best_model = automl.model.estimator
# 打印最佳模型的信息
print(f'Best Model: {best_model}')
同样使用AutoML进行回归任务,设置time_budget=30秒,限制训练时间,在训练集和测试集上计算并输出不同的回归性能指标,并最终显示最佳模型的信息
通过设置不同的time_budget(训练时间),寻找到最终的最佳模型
测试集Mean Absolute Error (MAE): 7.397615151313552
测试集Mean Squared Error (MSE): 101.44100619696354
测试集Root Mean Squared Error (RMSE): 10.071792600970472
测试集R-squared (R2): 0.8772094761495342
-------------------------
训练集Mean Absolute Error (MAE): 3.9272918371754604
训练集Mean Squared Error (MSE): 28.775896803825596
训练集Root Mean Squared Error (RMSE): 5.364316993227153
训练集R-squared (R2): 0.9646566270660979
Best Model: ExtraTreesRegressor(max_features=0.6490475444011059, max_leaf_nodes=80,
n_estimators=9, n_jobs=-1, random_state=12032022)
from flaml import AutoML
automl_settings = {
"time_budget": 120, # in seconds
"metric": "rmse",
"task": "regression",
"split_type": 'auto', # 使用 K 折交叉验证
"n_splits": 5 # 5 折交叉验证
}
automl = AutoML()
automl.fit(X_train, y_train,**automl_settings)
# 预测测试集
y_train_pred = automl.predict(X_train)
y_pred = automl.predict(X_test)
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np
# 计算不同的性能指标
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
# 打印性能指标
print(f'测试集Mean Absolute Error (MAE): {mae}')
print(f'测试集Mean Squared Error (MSE): {mse}')
print(f'测试集Root Mean Squared Error (RMSE): {rmse}')
print(f'测试集R-squared (R2): {r2}')
print(f'-------------------------')
# 计算不同的性能指标
mae = mean_absolute_error(y_train, y_train_pred)
mse = mean_squared_error(y_train, y_train_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_train, y_train_pred)
# 打印性能指标
print(f'训练集Mean Absolute Error (MAE): {mae}')
print(f'训练集Mean Squared Error (MSE): {mse}')
print(f'训练集Root Mean Squared Error (RMSE): {rmse}')
print(f'训练集R-squared (R2): {r2}')
# 获取最佳模型
best_model = automl.model.estimator
# 打印最佳模型的信息
print(f'Best Model: {best_model}')
在训练时间为120秒的限制下使用AutoML进行回归任务,最终在 2:8 数据划分的情况下,通过评估回归性能指标(如MAE、MSE、RMSE、R²),成功找到了最优模型
测试集Mean Absolute Error (MAE): 6.775893670213913
测试集Mean Squared Error (MSE): 86.11757886507971
测试集Root Mean Squared Error (RMSE): 9.279955757711333
测试集R-squared (R2): 0.8957579087785756
-------------------------
训练集Mean Absolute Error (MAE): 2.507009468278629
训练集Mean Squared Error (MSE): 12.757921353300176
训练集Root Mean Squared Error (RMSE): 3.571823253367974
训练集R-squared (R2): 0.9843303590040977
Best Model: RandomForestRegressor(max_features=0.6257859732687593, max_leaf_nodes=184,
n_estimators=129, n_jobs=-1, random_state=12032022)
结果显示了在120秒的训练时间限制下,AutoML在2:8数据划分下找到的最佳模型是RandomForestRegressor,其在训练集上的R²为0.98,测试集上的R²为0.90,表明模型在训练集上拟合较好,并且在测试集上也有较好的预测表现
绘制最优模型的散点图、边缘直方图和回归线的联合图,比较训练集和测试集的实际值与预测值,展示了MAE、RMSE和R²等性能指标
计算残差和标准差,绘制测试集的预测值与真实值,并展示不同置信区间(μ ± σ、μ ± 2σ、μ ± 3σ)的可视化图像,帮助评估模型的预测精度和不确定性
import seaborn as sns
# 进行预测
y_pred = automl.predict(X_test)
#计算残差
residuals = y_test - y_pred
# 绘制残差图
plt.figure(figsize=(12, 5),dpi =300)
# 残差与预测值散点图
plt.subplot(1, 2, 1)
plt.scatter(y_pred, residuals)
plt.axhline(0, color='red', linestyle='--')
plt.title('Predicted Values Residuals')
plt.xlabel('Test Sample')
plt.ylabel('Residuals')
# 残差直方图
plt.subplot(1, 2, 2)
sns.histplot(residuals, kde=True)
plt.title('Residuals Distribution')
plt.xlabel('Residuals')
plt.tight_layout()
plt.savefig("Predicted Values Residuals.png")
plt.show()
通过绘制残差散点图和残差分布直方图,展示模型预测结果与真实值之间的残差,以及残差的分布情况,用于评估模型的拟合效果,也就是文献中的 残差分析针对最优模型
最后展示了最优模型在模拟数据集上的部分依赖分析结果,包括1D、2D和3D的部分依赖图,分析了特征infP、infC 和 infAc对模型预测结果的影响,帮助揭示这些特征与预测值之间的关系和交互作用
当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息
✨ 该文章案例 ✨
在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
✨ 书籍推荐 ✨
无论你是零编程基础的科研新手,还是想提升机器学习技能的医学科研工作者,这本书都能带你从入门到进阶,掌握Python数据分析+医学AI应用的全流程技能
✨ 介绍 ✨
本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。
✨ 群友反馈 ✨
✨ 淘宝店铺 ✨
请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!
✨ AI工具推荐 ✨
往期推荐
期刊复现:连续数据与分类数据共存的SHAP可视化散点图与箱形图组合形式
期刊复现:多分类任务如何拆分为二分类任务并进行堆叠预测提高模型预测性能
期刊配图:SHAP值分析模型可解释性在柱状图与蜂窝图中的进阶组合展示
期刊配图:通过堆叠Mean|SHAP|展示不同区间对模型贡献度的可视化分析
期刊复现:利用UMAP降维算法可视化深度学习随着训练次数的增加模型区分能力的变化
期刊配图:PCA、t-SNE与UMAP三种降维方法简化高维数据的展示应用对比
Science期刊复现:分类、回归与Shap分析多角度揭示同一数据集变量对目标的影响
多模型SHAP+PDP解读Stacking集成模型:从基学习器到元学习器的可解释性与模型调参实现
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考