Python:具有离散(分类)特征的随机森林回归?

Python: Random forest regression with discrete (categorial) features?

我正在使用随机森林回归器,因为我的目标值不是绝对的。但是,功能是。

当我 运行 算法时,它将它们视为连续变量。

有什么方法可以将它们视为分类的吗?

示例:

当我尝试随机森林回归器时,它会将用户 ID 视为连续的(取值 1.5 等)

数据框中的dtype是int64。

你能帮我吗?

谢谢

这是我试过的代码:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn import tree
from matplotlib import pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
import numpy as np

df = pd.read_excel('Data_frame.xlsx', sheet_name=5)
df.head
df.dtypes



X = df.drop('productivity', axis='columns')
y = df['productivity']


X_train, X_test, y_train, y_test = train_test_split(X, y)
rf = RandomForestRegressor(bootstrap=False, n_estimators=1000, criterion='squared_error', max_depth=5, max_features='sqrt')
rf.fit(X_train.values, y_train)

plt.figure(figsize=(15,20))
_ = tree.plot_tree(rf.estimators_[1], feature_names=X.columns, filled=True,fontsize=8)

y_predict = rf.predict(X_test.values)
mae = mean_absolute_error(y_predict,y_test)
print(mae)

首先,RandomForestRegressor只接受数值。因此,将您的数值编码为分类值不是解决方案,因为您将无法训练您的模型。

处理这类问题的方法是OneHotEncoder。此函数将为指定特征中的每个值创建一列。

下面是代码示例:

# creating initial dataframe
values = (1,10,1,2,2,3,4)
df = pd.DataFrame(values, columns=['Numerical_data'])

Datafram 将如下所示:

    Numerical_data
0   1
1   10
2   1
3   2
4   2
5   3
6   4

现在,OneHotEncode:

enc = OneHotEncoder(handle_unknown='ignore') 
enc_df = pd.DataFrame(enc.fit_transform(df[['Bridge_Types']]).toarray())
enc_df

    0   1   2   3   4
0   1.0 0.0 0.0 0.0 0.0
1   0.0 0.0 0.0 0.0 1.0
2   1.0 0.0 0.0 0.0 0.0
3   0.0 1.0 0.0 0.0 0.0
4   0.0 1.0 0.0 0.0 0.0
5   0.0 0.0 1.0 0.0 0.0
6   0.0 0.0 0.0 1.0 0.0

然后,根据您的需要,您可以将这个计算的框架加入到您的数据集中。请注意,您应该删除初始功能:

# merge with main df bridge_df on key values

df = df.join(enc_df)
df

    Numerical_data 0    1   2   3   4
0   1   1.0 0.0 0.0 0.0 0.0
1   10  0.0 0.0 0.0 0.0 1.0
2   1   1.0 0.0 0.0 0.0 0.0
3   2   0.0 1.0 0.0 0.0 0.0
4   2   0.0 1.0 0.0 0.0 0.0
5   3   0.0 0.0 1.0 0.0 0.0
6   4   0.0 0.0 0.0 1.0 0.0

当然,如果您在指定的特征中有数百个不同的值,则会创建许多列。但这是继续进行的方式。