import pandas as pd
from sklearn.tree import DecisionTreeRegressor, plot_tree
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
import matplotlib.pyplot as plt
# 读取含有热误差数据的 CSV 文件
file = open('data0.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=300)
# 创建决策树模型
dt = DecisionTreeRegressor()
# 定义网格搜索参数
param_grid = {
'max_depth': [7,8,9,10],
'min_samples_split': [2, 4, 6],
'min_samples_leaf': [1, 2, 3]
}
# 进行网格搜索优化
grid = GridSearchCV(dt, param_grid, cv=5, error_score='raise')
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_
best_dt = DecisionTreeRegressor(max_depth=grid.best_params_['max_depth'], min_samples_leaf=grid.best_params_['min_samples_leaf'], min_samples_split=grid.best_params_['min_samples_split'])
best_dt.fit(X_train, Y_train)
# 输出最优参数和模型得分
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}")
print(Y_pred)
# 绘制决策树并保存为 PNG 图像文件
fig, ax = plt.subplots(figsize=(15, 15))
plot_tree(best_dt, ax=ax, feature_names=X_train)
plt.savefig("decision_tree6.png")
如何再增加一个补偿系统设计呢
修改读取 CSV 文件的代码,增加补偿系统的状态或输出作为新的一列数据。
修改对数据的预处理代码,将新的输入变量进行标准化。
修改数据集的划分代码,保证新的输入变量也能够被正确地划分为训练集和测试集。
修改网格搜索参数的定义,增加一个新的参数,表示补偿系统的状态或输出。
在模型训练时,增加新的输入变量,并按照新的参数进行优化。
输出最优参数和模型得分。
定义新的补偿系统状态或输出数据。
输出预测结果。
绘制更新后的决策树并保存为 PNG 图像文件。
下面是可能的代码实现:
import pandas as pd
from sklearn.tree import DecisionTreeRegressor, plot_tree
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
import matplotlib.pyplot as plt
# 读取含有热误差和补偿系统数据的 CSV 文件
file = open('data0.csv', encoding='utf-8')
df = pd.read_csv(file)
# 对数据进行预处理
X = df.iloc[:, :-2] # 输入变量(除了最后两列)
Y = df.iloc[:, -2] # 补偿系统状态或输出
Z = df.iloc[:, -1] # 输出的热误差值
X_scaled = preprocessing.scale(X) # 对输入变量进行标准化,避免某些维度权值过大或过小
# 划分数据集
X_train, X_test, Y_train, Y_test, Z_train, Z_test = train_test_split(X_scaled, Y, Z, test_size=0.2, random_state=300)
# 创建决策树模型
dt = DecisionTreeRegressor()
# 定义网格搜索参数
param_grid = {
'max_depth': [7, 8, 9, 10],
'min_samples_split': [2, 4, 6],
'min_samples_leaf': [1, 2, 3],
'criterion': ['mse', 'friedman_mse', 'mae'],
'splitter': ['best', 'random'],
'max_features': ['auto', 'sqrt', 'log2', None],
'random_state': [42],
'ccp_alpha': [0.0, 0.1, 0.2, 0.3]
}
# 进行网格搜索优化
grid = GridSearchCV(dt, param_grid, cv=5, error_score='raise')
grid.fit(X, Z)
# 训练最优决策树模型
best_model = grid.best_estimator_
best_dt = DecisionTreeRegressor(max_depth=grid.best_params
回顾什么是自由变量这个问题,自由变量就是任意取值,这两个自由变量的组合可以想象成任意的一个二维向量(解向量是三维向量,对于其中任意一个二维向量分量,第三个一维向量分量都有唯一的表示方法)。而所有解实际上就变成了,任意取值的二维向量(第三个分量由这个二维向量确定,因此不用管)。
那么问题就变成了,我们怎么用一个向量组去表示这个任意的二维向量?