前言
本文主要使用python的sklearn库进行线性回归分析和预测,用到的文件有:LinearRegression_Training.csv和LinearRegression_Scoring.csv,分别作为训练数据和待预测数据。
数据文件下载:
- https://file.sfnote.com/d/data/LinearRegression_Training.csv
- https://file.sfnote.com/d/data/LinearRegression_Scoring.csv
代码
# 导入必要的库
import pandas as pd
import sklearn.preprocessing as preprocessing
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
# 预处理输入
# imp = SimpleImputer(missing_values=np.nan, strategy='mean')
# 预处理标签
le = preprocessing.LabelEncoder()
# 加载训练数据集
data = pd.read_csv("LinearRegression_Training.csv", sep=",", encoding="latin")
# 建模,确定输入输出
output = ["2nd_Heart_Attack"]
data = data[:-2] # 舍弃无效行
train = data.drop(output, axis=1)
# 处理非数值数据
data['2nd_Heart_Attack'] = data['2nd_Heart_Attack'].replace('Yes', 1)
data['2nd_Heart_Attack'] = data['2nd_Heart_Attack'].replace('No', 0)
# print(train)
# 将数据集拆分为训练集和测试集
test_size = 0.1
X_train, X_test, y_train, y_test = train_test_split(train, data["2nd_Heart_Attack"], test_size=test_size, random_state=0)
# 考虑到接下来可能需要进行其他的操作,所以定了一个随机种子,保证接下来的train和test是同一组数
# 数据预处理
# 创建线性回归模型
model = LinearRegression()
# 在训练集上训练模型
model.fit(X_train, y_train)
#print(X_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算模型的性能指标
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'test_size: {test_size}\nMean Squared Error: {mse}\nR^2: {r2}')
# 使用所有训练数据进行训练
model.fit(train, data['2nd_Heart_Attack'])
# 加载新的数据集
data = pd.read_csv("LinearRegression_Scoring.csv", sep=",")
# 在新的数据集上进行预测
y_pred = model.predict(data)
# 根据规则计算预测结果
y = []
for i, j in enumerate(y_pred):
if j > 0.5:
y.append('Yes')
else:
y.append('No')
# 合并结果并写入文件
data['2nd_Heart_Attack'] = y
pd.DataFrame(data).to_csv('result.csv')
结果分析
从以上结果可以看出,我们采用训练数据中90%的数据进行训练,10%的数据进行测试时,均方差仅0.02左右,拟合优度在0.90左右,说明线性拟合效果较好,可以使用该模型进行预测。
接下来我们使用所有的训练数据进行训练,再使用模型去预测新的数据,由于之前定义0为’No’,1为’Yes’,所以最后整理结果时采用大于0.5的预测结果设置为’Yes’, 小于0.5的结果设置为’No’。最后再合成结果,写入新的文件result.csv。如图:
1 条评论
(ฅ´ω`ฅ)