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
当然,如果您在指定的特征中有数百个不同的值,则会创建许多列。但这是继续进行的方式。
我正在使用随机森林回归器,因为我的目标值不是绝对的。但是,功能是。
当我 运行 算法时,它将它们视为连续变量。
有什么方法可以将它们视为分类的吗?
示例:
当我尝试随机森林回归器时,它会将用户 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
当然,如果您在指定的特征中有数百个不同的值,则会创建许多列。但这是继续进行的方式。