根据报错信息,`linreg`是一个元组对象,没有`fit`方法。这是因为在使用`LassoCV`的`path`方法时,返回的是一个包含3个元素的元组,分别是:
1. `alphas`:不同lambda值的数组。
2. `coefs`:每个特征在不同lambda值下的系数矩阵。
3. `mse`:每个lambda值下的均方误差数组。
因此,在使用`path`方法后,需要从元组中提取出需要的元素,然后再进行模型拟合和预测。
修改代码如下:
```python
import numpy as np
import pandas as pd
from sklearn.linear_model import LassoCV
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_csv('data.csv')
X = data.iloc[:, :-1].values
y = data.iloc[:, -1].values
# 自适应Lasso模型
alphas, coefs, mse = LassoCV(cv=10, random_state=0, max_iter=10000).path(X, y, eps=0.001)
# 输出最优lambda值
alpha_opt = alphas[np.argmin(np.mean(mse, axis=1))]
print("Optimal lambda:", alpha_opt)
# 提取最优lambda值对应的系数
lasso = LassoCV(cv=10, random_state=0, max_iter=10000, eps=0.001, alphas=[alpha_opt])
lasso.fit(X, y)
coef = lasso.coef_
# 特征筛选后的系数可视化
plt.figure(figsize=(10, 6))
for i in range(coefs.shape[0]):
plt.plot(alphas, coefs[i], label='Feature {}'.format(i+1))
plt.xscale('log')
plt.xlabel('Log(alpha)')
plt.ylabel('Coefficients')
plt.title('Lasso Paths')
plt.legend(loc='best')
plt.show()
# lambda与RMSE关系曲线图
mse_mean = np.mean(mse, axis=1)
plt.figure(figsize=(10, 6))
plt.plot(alphas, mse_mean, label='Mean Squared Error