文本文件 data.txt 给出了多个水样中观测到的微生物数量和环境数据, 请分析此数据, 训练预测模型并给出评测. 具体要求为 选取构造合适的特征, 训练线性回归模型, 预测各种生物的数量, 预测值输出为 学号-modelA.csv 文件. 取 RMSE 为评测指标. 自行选取合适的回归预测模型, 预测各种生物的数量, 预测值输出为 学号-modelB.csv 文件. 测试数据只能在评测阶段使用, 不得用于分析和模型训练. 提交如下 4 份文件 学号-姓名.ipynb , 以及对应的 PDF 文件 学号-姓名.pdf 学号-modelA.csv , 学号-modelB.csv 文档格式要求 使用提供的章节框架, 可略作改动 给出必要的分析和解读, 语言流畅,思路清晰,层次分明,图表数据结果丰富,代码完整 给出完整的流程、代码、图表和输出结果. 正式提交的文档中, 代码框从 [1] 开始顺序不间断编号. 数据文件说明如下: 前面各列依次为环境数据 season, size, speed, mxPH, mnO2, Cl, NO3, NH4, oPO4, PO4, Chla, 数据缺失用 XXXXXXX 表示 最后 7 列依次为 7 种微生物 y1, y2, y3, y4, y5, y6, y7 的观测数量 testX.txt 和 testY.txt 为测试数据
时间: 2023-08-11 08:07:42 浏览: 178
这是一个测试用的数据文件
# 1. 数据预处理
首先,我们需要读取数据文件并对其进行预处理,以方便后续的特征工程和模型训练。具体地,我们需要完成以下几个步骤:
1. 读取数据文件并将其中的 XXXXXXX 表示的缺失值替换为 NaN。
2. 将环境数据和微生物数量分别拆分为 X 和 y 两个矩阵。
3. 对 X 矩阵进行特征工程,包括数据归一化、多项式特征构造等操作。
下面是完整代码实现:
```python
import numpy as np
import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
# 读取数据文件
data = pd.read_csv('data.txt', sep='\s+')
data.replace('XXXXXXXX', np.nan, inplace=True)
# 拆分 X 和 y 矩阵
X = data.iloc[:, :-7].values
y = data.iloc[:, -7:].values
# 使用均值填充缺失值
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
X = imputer.fit_transform(X)
# 对 X 矩阵进行特征工程
scaler = StandardScaler()
X = scaler.fit_transform(X)
poly = PolynomialFeatures(degree=2)
X = poly.fit_transform(X)
```
# 2. 模型训练
接下来,我们可以使用已经预处理好的数据 X 和 y 训练模型了。我们需要完成以下几个步骤:
1. 将数据集划分为训练集和验证集,以便评估模型的性能。
2. 使用线性回归模型进行训练,并打印出训练和验证集上的 RMSE 指标。
下面是完整代码实现:
```python
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练线性回归模型
model_A = LinearRegression()
model_A.fit(X_train, y_train)
# 预测并计算 RMSE 指标
y_pred_train = model_A.predict(X_train)
y_pred_val = model_A.predict(X_val)
rmse_train = np.sqrt(mean_squared_error(y_train, y_pred_train))
rmse_val = np.sqrt(mean_squared_error(y_val, y_pred_val))
print(f"Train RMSE: {rmse_train:.4f}")
print(f"Validation RMSE: {rmse_val:.4f}")
```
# 3. 模型优化
我们可以对模型进行优化,以进一步提高其性能。这里我们尝试了两种优化方法:
1. 使用 Lasso 回归模型进行训练,以缩减特征空间,避免过拟合。
2. 使用 XGBoost 回归模型进行训练,以提高模型的预测能力。
下面是完整代码实现:
```python
from sklearn.linear_model import Lasso
import xgboost as xgb
# 使用 Lasso 回归模型进行训练
model_B_lasso = Lasso(alpha=0.1)
model_B_lasso.fit(X_train, y_train)
y_pred_train = model_B_lasso.predict(X_train)
y_pred_val = model_B_lasso.predict(X_val)
rmse_train = np.sqrt(mean_squared_error(y_train, y_pred_train))
rmse_val = np.sqrt(mean_squared_error(y_val, y_pred_val))
print(f"Lasso Train RMSE: {rmse_train:.4f}")
print(f"Lasso Validation RMSE: {rmse_val:.4f}")
# 使用 XGBoost 回归模型进行训练
dtrain = xgb.DMatrix(X_train, label=y_train)
dval = xgb.DMatrix(X_val, label=y_val)
params = {'max_depth': 3, 'eta': 0.1, 'objective': 'reg:squarederror', 'eval_metric': 'rmse'}
model_B_xgb = xgb.train(params, dtrain, num_boost_round=1000, early_stopping_rounds=10, evals=[(dval, 'val')])
y_pred_train = model_B_xgb.predict(dtrain)
y_pred_val = model_B_xgb.predict(dval)
rmse_train = np.sqrt(mean_squared_error(y_train, y_pred_train))
rmse_val = np.sqrt(mean_squared_error(y_val, y_pred_val))
print(f"XGBoost Train RMSE: {rmse_train:.4f}")
print(f"XGBoost Validation RMSE: {rmse_val:.4f}")
```
# 4. 模型评估
最后,我们需要对模型进行评估,并输出预测结果到文件中。具体来说,我们需要完成以下几个步骤:
1. 使用训练好的模型对测试数据进行预测。
2. 计算 RMSE 指标并输出到屏幕上。
3. 将预测结果输出到文件中。
下面是完整代码实现:
```python
# 读取测试数据文件
test_X = pd.read_csv('testX.txt', sep='\s+')
test_X.replace('XXXXXXXX', np.nan, inplace=True)
# 使用均值填充缺失值
test_X = imputer.transform(test_X)
# 对测试数据进行特征工程
test_X = scaler.transform(test_X)
test_X = poly.transform(test_X)
# 使用模型进行预测并计算 RMSE 指标
test_y_pred = model_A.predict(test_X)
test_rmse = np.sqrt(mean_squared_error(test_y_pred, np.loadtxt('testY.txt')))
print(f"Test RMSE: {test_rmse:.4f}")
# 输出预测结果到文件中
np.savetxt("315010XXXX-modelA.csv", test_y_pred, delimiter=",")
np.savetxt("315010XXXX-modelB.csv", model_B_xgb.predict(xgb.DMatrix(test_X)), delimiter=",")
```
# 5. 总结
本文介绍了如何使用 Python 和 Scikit-Learn 库对给定的水样数据进行建模和预测,并将结果输出到文件中。具体来说,我们完成了以下几个步骤:
1. 数据预处理,包括数据读取、缺失值填充和特征工程等操作。
2. 使用线性回归模型进行训练,并对其进行评估和优化。
3. 输出预测结果到文件中,并计算 RMSE 指标。
通过本次实践,我们掌握了数据预处理、特征工程、模型训练和评估等基本技能,为后续的机器学习和数据分析工作打下了坚实的基础。
阅读全文