<p><code>scikit-learn</code>没有分类变量(R中的a.k.a因子)的专用表示,一种可能的解决方案是使用<code>LabelEncoder</code>将字符串编码为<code>int</code>:</p>
<pre><code>import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestRegressor
X = np.asarray([('a',1,2),('b',2,3),('a',3,2),('c',1,3)])
y = np.asarray([1,2.5,3,4])
# transform 1st column to numbers
X[:, 0] = LabelEncoder().fit_transform(X[:,0])
regressor = RandomForestRegressor(n_estimators=150, min_samples_split=2)
regressor.fit(X, y)
print(X)
print(regressor.predict(X))
</code></pre>
<p>输出:</p>
<pre><code>[[ 0. 1. 2.]
[ 1. 2. 3.]
[ 0. 3. 2.]
[ 2. 1. 3.]]
[ 1.61333333 2.13666667 2.53333333 2.95333333]
</code></pre>
<p>但是请记住,如果<code>a</code>和<code>b</code>是独立的类别,并且它只适用于基于树的估计器,那么这是一个小技巧。为什么?因为<code>b</code>实际上并不大于<code>a</code>。正确的方法是在<code>LabelEncoder</code>或<code>pd.get_dummies</code>之后使用<code>OneHotEncoder</code>,从而生成两个独立的、一个热编码的<code>X[:, 0]</code>列。</p>
<pre><code>import numpy as np
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.ensemble import RandomForestRegressor
X = np.asarray([('a',1,2),('b',2,3),('a',3,2),('c',1,3)])
y = np.asarray([1,2.5,3,4])
# transform 1st column to numbers
import pandas as pd
X_0 = pd.get_dummies(X[:, 0]).values
X = np.column_stack([X_0, X[:, 1:]])
regressor = RandomForestRegressor(n_estimators=150, min_samples_split=2)
regressor.fit(X, y)
print(X)
print(regressor.predict(X))
</code></pre>