# 假设“满意度”是因变量,其他的是自变量
# 提取自变量(特征)和因变量(目标)
X = df_filtered_cleaned[['Bonus', 'Enhancement', 'Time_in_seconds']]
y = df_filtered_cleaned['Satisfaction']
# 分割为训练集和测试集。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(X_train) + '-' + (X_test)
class MultivariateLinearRegression:
? ? def __init__(self):
? ? ? ? self.coefficients = None
? ? ? ? self.intercept = None
? ? def fit(self, X, y):
? ? ? ? """
? ? ? ? 使用普通最小二乘法的闭式解来拟合模型。
? ? ? ? X:形状为(n_samples,n_features)的numpy数组
? ? ? ? y:形状为(n_samples,)的numpy数组? ? ? ? """
? ? ? ? # 在输入特征中添加偏置列
? ? ? ? X_b = np.c_[np.ones((X.shape[0], 1)), X]
? ? ? ? # 使用正规方程计算最佳参数
? ? ? ? theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
? ? ? ? self.intercept = theta_best[0]
? ? ? ? self.coefficients = theta_best[1:]
? ? def predict(self, X):
? ? ? ? """
? ? ? ? 使用训练好的模型进行预测。
? ? ? ? X: numpy数组的形状(n_samples, n_features)
? ? ? ? """
? ? ? ? # 在输入特征中添加偏置列
? ? ? ? X_b = np.c_[np.ones((X.shape[0], 1)), X]
? ? ? ? # 计算预测
? ? ? ? return X_b.dot(np.r_[self.intercept, self.coefficients])
# 初始化线性回归模型
model_custom = MultivariateLinearRegression()
# 使用训练数据拟合模型
model_custom.fit(X_train, y_train)
# 预测测试集的满意度分数
y_pred_custom = model_custom.predict(X_test)
# 计算预测结果的均方误差(MSE)
mse_custom = mean_squared_error(y_test, y_pred_custom)
# 输出模型的系数和均方误差
coefficients_custom = model_custom.coefficients
intercept_custom = model_custom.intercept
# 格式化模型的方程式
model_equation = f"Satisfaction = {intercept_custom:.4f}"
for i, coef in enumerate(coefficients_custom):
? ? model_equation += f" + ({coef:.4f}) * X{i+1}"
print( mse_custom)
# 由于我们处理的是多个特征,无法绘制一条单独的线。
# 然而,我们可以绘制真实值与预测值之间的图表来观察模型性能。
# 对整个数据集进行满意度评分预测,并将其与真实值进行比较。
y_pred_entire_dataset = model_custom.predict(X)
print(y_pred_entire_dataset)
plt.figure(figsize=(10, 6))
plt.scatter(y, y_pred_entire_dataset, alpha=0.5)
plt.plot([min(y), max(y)], [min(y), max(y)], 'r--')
plt.title('True vs Predicted Satisfaction')
plt.xlabel('True Values')
plt.ylabel('Predicted Values')
plt.show()
plt.savefig('test5.jpg')