python - 如何使用分类和非分类特征进行回归
问题描述
如果我有多个特征,但有些特征是分类的,有些不是,那么使用 sklearn 进行回归的正确方法是什么?
我正在尝试“ColumnTransformer”,但我不确定我做得是否好:
features = df[['grad', 'oblast', 'tip',
'parcela', 'bruto', 'neto', 'osnova',
'neto/bruto', 'zauzetost', 'sipovi', 'garaza',
'nadzemno', 'podzemno', 'tavanica', 'fasada']]
results = df[['ukupno gradjevinski din']]
trans = ColumnTransformer(transformers=[('onehot', OneHotEncoder(), ['grad', 'oblast', 'tip', 'garaza', 'tavanica', 'fasada']),
('normalizer', Normalizer(), ['parcela', 'bruto', 'neto', 'osnova', 'neto/bruto', 'zauzetost', 'nadzemno'])],
remainder='passthrough') # Default is to drop untransformed columns
features = trans.fit_transform(features)
当我为某些功能打印 corr() 时,我发现它们与结果之间存在很大的相关性:
print(df[['parcela', 'bruto', 'neto', 'osnova', 'ukupno gradjevinski din']].corr().to_string())
parcela bruto neto osnova ukupno gradjevinski din
parcela 1.000000 0.929939 0.930039 0.987574 0.911690
bruto 0.929939 1.000000 0.998390 0.943996 0.878914
neto 0.930039 0.998390 1.000000 0.946102 0.889850
osnova 0.987574 0.943996 0.946102 1.000000 0.937064
ukupno gradjevinski din 0.911690 0.878914 0.889850 0.937064 1.000000
问题是我已经堆叠了 7-8 个回归模型并且我正在用 评估它们cross-validation
,但我得到的分数从 -10 到 -80,这对我来说不正常。
regressors = [
["Bagging Regressor TREE", BaggingRegressor(base_estimator = DecisionTreeRegressor(max_depth=15))],
["Bagging Regressor FOREST", BaggingRegressor(base_estimator = RandomForestRegressor(n_estimators = 100))],
["Bagging Regressor linear", BaggingRegressor(base_estimator = LinearRegression(normalize=True))],
["Bagging Regressor lasso", BaggingRegressor(base_estimator = Lasso(normalize=True))],
["Bagging Regressor SVR rbf", BaggingRegressor(base_estimator = SVR(kernel = 'rbf', C=10.0, gamma='scale'))],
["Extra Trees Regressor", ExtraTreesRegressor(n_estimators = 150)],
["K-Neighbors Regressor", KNeighborsRegressor(n_neighbors=1)]]
for reg in regressors:
scores = cross_val_score(reg[1], features, results, cv=5, scoring='r2')
scores = np.average(scores)
print(reg[0], scores)
每次谈到“Bagging Regressor linear”时,它都会给我一个错误:
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
即使我只使用您在 corr() 中看到的特征运行回归模型,我也会得到相同的结果。
你能告诉我更多关于我遇到的问题吗?
解决方案
将分类和非分类特征组合到回归模型的一种方法是对分类特征使用 one-hot 编码。具体而言,如果您有一个可能有 3 个值的分类特征,那么您创建 3 个列,根据其单热编码值填充 0 和 1。
您可以在《 Python 机器学习简介:数据科学家指南》一书中的 One-Hot-Encoding (Dummy Variables) 部分的第 213 页上找到带有清晰解释、示例和实现的详细信息。
推荐阅读
- android - Android SDK 管理器不显示 Android SDK Platform_tools
- javascript - React Native 使用 auth() 时出错
- swift - 使用 watchOS 5 访问 Apple Watch 应用扩展上的用户默认值
- tensorflow - 修复要保留的模型检查点的数量 pytorch
- r - xaringan:改变纵横比的简单方法?
- excel - Excel 连续查找第二个实例的列引用
- java - 当 application.properties 中没有对应的嵌套键/值对时,Spring Boot 为嵌套配置绑定初始化新实例
- php - 查看表 IF CASE 条件不能正常工作
- typo3 - 为什么我的 DataProcessing\MenuProcessor 没有为我的页面树显示 level-3 和 level-4
- java - 从 ile RPG 调用 Java set 和 get 方法