基于优化决策树的热误差建模


import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV
# 读取含有热误差数据的CSV文件
file = open('data1.csv',encoding='utf-8')
df = pd.read_csv(file)
# 对数据进行预处理
X = df.iloc[:, :-1]  # 输入变量
Y = df.iloc[:, -1]  # 输出的热误差值
X_scaled = preprocessing.scale(X)  # 对输入变量进行标准化,避免某些维度权值过大或过小

# 划分数据集
X_train, X_test, Y_train, Y_test = train_test_split(X_scaled, Y, test_size=0.2, random_state=72)

# 创建决策树模型
dt = DecisionTreeRegressor()
 
# 定义网格搜索参数
param_grid = {
    'max_depth': [1,2,3,4,5,6,7,8,9],
    'min_samples_split': [2, 4, 6],
    'min_samples_leaf': [1, 2, 3]
}
# 进行网格搜索优化
grid = GridSearchCV(dt, param_grid, cv=5)
grid.fit(X, Y)
grid_search = GridSearchCV(DecisionTreeRegressor(), param_grid, cv=5)
grid_search.fit(X_train, Y_train)
best_model = grid_search.best_estimator_
 
# 输出最优参数和模型得分
print('Best Parameters:', grid.best_params_)

# 定义新的温度数据

# 输出预测结果
Y_pred = best_model.predict(X_test)
mse = mean_squared_error(Y_test, Y_pred)
print(f"MSE: {mse:.4f}")

能不能改一下代码使用两批数据,一批作为训练集,一批为测试集读取两批数据进行建模

你把代码发给我看一下

只需要按照以下步骤进行修改:

读取第一批含有热误差数据的CSV文件,并将其存储在DataFrame中,作为训练集;

读取第二批含有热误差数据的CSV文件,并将其存储在DataFrame中,作为测试集;

对训练集进行数据预处理,将输入变量和输出变量分别存储在X_train和Y_train中,对输入变量进行标准化;

对测试集进行数据预处理,将输入变量和输出变量分别存储在X_test和Y_test中,对输入变量进行标准化,注意标准化需使用在训练集上计算的mean和std进行;

创建决策树模型;

定义网格搜索参数,包括决策树最大深度、最小分裂样本数和最小叶子节点数等三个参数,用于对模型进行优化;

使用网格搜索优化,寻找最佳的参数组合,进一步优化模型;

输出最优参数组合,并用最佳的模型对测试数据集进行预测,计算均方误差,用于评估模型的性能。

修改后的代码如下所示:

import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn import preprocessing
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV

# 读取训练集的含有热误差数据的CSV文件
train_file = open('train_data.csv', encoding='utf-8')
train_df = pd.read_csv(train_file)

# 读取测试集的含有热误差数据的CSV文件
test_file = open('test_data.csv', encoding='utf-8')
test_df = pd.read_csv(test_file)

# 对训练集进行数据预处理
X_train = train_df.iloc[:, :-1]
Y_train = train_df.iloc[:, -1]
X_train_scaled = preprocessing.scale(X_train)

# 对测试集进行数据预处理
X_test = test_df.iloc[:, :-1]
Y_test = test_df.iloc[:, -1]
X_test_scaled = preprocessing.scale(X_test, with_mean=X_train_scaled.mean(axis=0), 
                                    with_std=X_train_scaled.mean(axis=0))

# 创建决策树模型
dt = DecisionTreeRegressor()

# 定义网格搜索参数
param_grid = {
    'max_depth': [1,2,3,4,5,6,7,8,9],
    'min_samples_split': [2, 4, 6],
    'min_samples_leaf': [1, 2, 3]
}

# 进行网格搜索优化
grid_search = GridSearchCV(DecisionTreeRegressor(), param_grid, cv=5)
grid_search.fit(X_train_scaled, Y_train)
best_model = grid_search.best_estimator_

# 输出最优参数和模型得分
print('Best Parameters:', grid_search.best_params_)

# 输出预测结果
Y_pred = best_model.predict(X_test_scaled)
mse = mean_squared_error(Y_test, Y_pred)
print(f"MSE: {mse:.4f}")

需要注意的是,在对测试集进行数据预处理时,需要使用在训练集上计算的均值(mean)和标准差(std)进行标准化,这里使用了with_mean和with_std两个参数来实现此功能,具体可以参考官方文档。https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html