days = df.iloc[:, 1].values # 投放天数
budget = df.iloc[:, 2].values # 日均预算
cvr = df.iloc[:, 3].values # CVR
roi = df.iloc[:, 4].values # ROI
# 标准化预算、天数和CVR(避免绝对数值差异过大导致模型权重失衡)
scaler_budget = StandardScaler()
scaler_days = StandardScaler()
scaler_cvr = StandardScaler()
budget_scaled = scaler_budget.fit_transform(budget.reshape(-1, 1)) # 标准化预算
days_scaled = scaler_days.fit_transform(days.reshape(-1, 1)) # 标准化天数
cvr_scaled = scaler_cvr.fit_transform(cvr.reshape(-1, 1)) # 标准化CVR
# 创建输入数据矩阵 X,包括预算、天数和CVR,
X = np.hstack([budget_scaled, days_scaled, cvr_scaled])
# 划分训练集和测试集 test_size = 0.2即训练数据的比例为20%,random_state=42 这里设置一个随机的种子,确保每次实验的结果相同便于对比
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化随机森林回归模型 n_estimators=100,这个随机森林由100棵决策树组成(即弱学习器),避免单个学习器的过拟合问题
rf = RandomForestRegressor(n_estimators=100, random_state=42)
# 使用网格搜索进行超参数调优,param_grid 相当于一个字典,定义了要搜索的超参数的候选值。
'n_estimators': [50, 100, 200], #决策树数量
'max_depth': [None, 5, 10], #决策树的最大深度
'min_samples_split': [2, 5, 10] #节点再划分的最小样本数
grid_search = GridSearchCV(rf, param_grid, cv=5, scoring='neg_mean_squared_error', n_jobs=-1)
grid_search.fit(X_train, y_train)
best_rf = grid_search.best_estimator_
y_pred = best_rf.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Test MSE: {mse}") #计算模型方差,判断模型的拟合度