有一些预测比例的标准方法,例如逻辑回归(无阈值)和 beta 回归。已经对此进行了讨论:
http://scikit -learn-general.narkive.com/lLVQGzyl/beta-regression
我无法判断
sklearn
框架内是否存在解决方法。
你提到的链接已经失效了,但我可以解释一下当目标变量是比例时,如何在 scikit-learn 中进行建模。
1. 数据预处理
- 检查比例范围: 确保你的比例数据在 0 到 1 之间。如果你的数据是百分比形式 (0% 到 100%),你需要将其除以 100。
-
处理边界值:
如果你的数据包含 0 或 1,你可能需要考虑使用一些转换技巧,例如:
- 添加少量值: 对所有比例值都加上一个很小的值,例如 0.001,避免出现 0。
- logit 变换: 对比例值进行 logit 变换,将 (0, 1) 范围映射到 (-∞, +∞) 。
2. 模型选择
scikit-learn 中没有直接的 Beta 回归模型,但你可以使用以下模型来处理比例数据:
-
线性回归 (Linear Regression):
- 优点: 简单易用。
- 缺点: 预测值可能超出 [0, 1] 范围。
-
逻辑回归 (Logistic Regression) (无阈值):
- 优点: 可以将输出限制在 [0, 1] 范围内。
- 缺点: 可能不适合处理靠近 0 或 1 的值。
-
Beta 回归 (Beta Regression) (使用 statsmodels 库):
- 优点: 专门为比例数据设计的模型,可以处理 0 和 1 的边界值。
-
缺点: 需要安装
statsmodels
库。
3. 代码示例
线性回归:
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
# 预测值
y_pred = model.predict(X_test)
# 确保预测值在 [0, 1] 范围内
y_pred = np.clip(y_pred, 0, 1)
逻辑回归 (无阈值):
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(solver='lbfgs') # 使用其他 solver 可能更适合你的数据
model.fit(X_train, y_train)
# 预测值 (概率)
y_pred_proba = model.predict_proba(X_test)[:, 1]
Beta 回归 (使用 statsmodels):
from statsmodels.formula.api import glm
from statsmodels.genmod.families import Binomial
from statsmodels.genmod.families.links import logit
# 需要将数据转换为 pandas DataFrame 格式,并将目标变量命名为 'y'
data = pd.DataFrame({'y': y_train, **X_train})
# 使用 logit link function
model = glm('y ~ X1 + X2', data=data, family=Binomial(link=logit()))
results = model.fit()
# 预测值 (使用 test 数据)
y_pred = results.predict(exog=pd.DataFrame({'X1': X_test[:, 0], 'X2': X_test[:, 1]}))
4. 模型评估
- 均方误差 (MSE): 适用于所有模型。
- 平均绝对误差 (MAE): 适用于所有模型。
- R-squared: 适用于线性回归。
- 对数似然: 适用于逻辑回归和 Beta 回归.
选择最适合你数据的模型和评估指标取决于你的具体问题和数据特点。
标签:python,scikit-learn From: 44234682