You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在Python/Jupyter Notebook中无法对y_train使用np.log1p?

问题分析与解决

问题背景

把数据集按60-20-20比例拆分为训练、验证、测试集后,用RandomForestRegressor训练模型时,对y_train应用np.log1p报错,但直接执行np.log1p(1e-99)能正常运行。

相关代码

#splitting dataset into train, val, and test into 60-20-20
features = df.drop('quality', axis = 1)
labels = df['quality']

X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.4, random_state=42)
X_test, X_val, y_test, y_val = train_test_split(X_test, y_test, test_size=0.5, random_state=42)

X_train.to_csv('train_features.csv', index=False)
X_val.to_csv('val_features.csv', index=False)
X_test.to_csv('test_features.csv', index=False)

y_train.to_csv('train_labels.csv', index=False)
y_val.to_csv('val_labels.csv', index=False)
y_test.to_csv('test_labels.csv', index=False)

from sklearn.ensemble import RandomForestRegressor
rfModel = RandomForestRegressor(n_estimators=500)
rfModel.fit(X_train, np.log1p(y_train))
preds2 = rfModel.predict(X_test)

y_train属性信息

执行y_train.info()结果:

count     815
unique      2
top         0
freq      704
Name: quality, dtype: int64

执行y_train.head()结果:

635     0
908     0
1578    0
245     0
1451    1
Name: quality, dtype: category
Categories (2, int64): [0 < 1]

错误信息(翻译后)

ValueError: 无法将字符串转换为浮点数: '0'

原因分析

从y_train.head()的输出能看出,y_train实际是category(分类)类型——虽然info()显示底层数据类型是int64,但np.log1p处理分类类型数据时,会将其识别为字符串而非数值,因此抛出转换错误。而直接调用np.log1p(1e-99)是处理纯数值,所以不会触发报错。

解决办法

先把y_train转换为数值类型,再应用np.log1p,有两种可行方式:

  • 方式一:用cat.codes提取分类的数值编码
    rfModel.fit(X_train, np.log1p(y_train.cat.codes))
    
  • 方式二:直接转换为int类型
    rfModel.fit(X_train, np.log1p(y_train.astype(int)))
    

额外提醒:你的标签是二分类的0和1,当前用回归模型(RandomForestRegressor)可能不符合任务场景,建议根据实际需求考虑换成分类模型(比如RandomForestClassifier)。


内容的提问来源于stack exchange,提问作者hauki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:48:17