训练和测试集中不同数量的特征 - 随机森林 sklearn Python
Posted
技术标签:
【中文标题】训练和测试集中不同数量的特征 - 随机森林 sklearn Python【英文标题】:Different Number of Features in Train and Test Sets - Random Forest sklearn Python 【发布时间】:2017-11-21 17:59:04 【问题描述】:我正在使用 Python 中的 sklearn 包将随机森林回归模型拟合到如下所示的数据:
data_train = ['.3 0:.5 1:.2 3:.7 6:.9 7:.1','.2 1:.5 2:.7 4:-0.3 5:1 6:0.7','.1 0:.3 1:.3 2:.2 3:.1 4:-0.2 5:0.3 6:0.7','.5 0:.3 1:.3 2:.5 3:.6 4:-0.1 5:0.4 6:0.6','.4 1:.3 2:.2 3:.2 4:-0.6 5:0.7 6:0.8','.6 0:.8 1:.3 2:.4 3:.4 4:-0.2 5:0.3 6:0.10','.9 0:.3 1:.3 2:.2 3:-.4 4:-0.2 5:-0.3','.9 0:.3 1:.1 2:.1 3:-.4 4:-0.1 5:-0.3','.1 0:.3 1:.3 2:.2 3:-.5 4:-0.2 5:-0.5']
data_test = ['.2 0:.4 1:.65 3:.8 6:.1','.2 1:.3 2:.6 4:-0.2 5:.6 6:0.6','.5 0:.3 1:.3 2:.2 3:.1 4:-0.2 5:0.3 6:0.7','.5 0:.3 1:.3 2:.5 3:.6 4:-0.1 5:0.4 6:0.6','.4 1:.3 2:.2 3:.2 4:-0.6 5:0.7 6:0.8','.6 0:.8 1:.3 2:.4 3:.4 4:-0.2 5:0.3 6:0.10','.9 0:.3 1:.3 2:.2 3:-.4 4:-0.2 5:-0.3','.9 0:.3 1:.1 2:.1 3:-.4 4:-0.1 5:-0.3','.1 0:.3 1:.3 2:.2 3:-.5 4:-0.2 5:-0.5']
对于每一行,第一个变量是输出变量,其他是特征:值对。
我使用以下代码为数据创建稀疏矩阵:
def sparse_mat(data):
row1 = []
col1 = []
data1 = []
y = []
for rownum,x in enumerate(data):
x = x.strip()
elems = x.split(' ')
for e,elem in enumerate(elems):
if e == 0:
y.append(float(elem.strip()))
else:
colnum = int(elem.split(':')[0])
value = float(elem.split(':')[1])
row1.append(rownum)
col1.append(colnum)
data1.append(value)
X = csc_matrix((data1, (row1, col1)))
return X,y
X_train,y_train = sparse_mat(data_train)
X_test,y_test = sparse_mat(data_test)
然后我使用以下代码拟合随机森林回归模型:
from scipy.sparse import csc_matrix,csr_matrix
from sklearn.ensemble import RandomForestRegressor
rf=RandomForestRegressor(n_estimators=50,max_features='sqrt')
rf=rf.fit(X_train,y_train)
但是,我随后尝试使用训练集中的模型,使用以下代码获取测试集输出变量的预测:
predictions=rf.predict(X_test)
我收到以下错误:
ValueError: Number of features of the model must match the input. Model n_features is 8 and input n_features is 7
我了解训练集上的特征数量应该与测试集上的特征数量相匹配。然而,在现实世界中,当我训练模型来预测结果变量时,我可能不知道样本外测试集中有哪些特征可用。有没有办法训练一个具有 N 个特征的随机森林模型,然后提供一个具有 N-k 个特征的测试集并仍然获得预测?
【问题讨论】:
【参考方案1】:上周我在工作中遇到了同样的问题。我们处理这个问题的方法是在测试数据集中创建额外的特征,并用训练数据中的估算值填充它。
然而,当您开始进入虚拟化类变量的领域时,您也可能会遇到问题。同样,我们使用的方法是将具有低基数的值组合到一个桶中。如果您要从数据库中提取数据,您需要使用 SQL 来实现此解决方案,因为您希望尽可能减少 Python 中的数据处理,因此请准备好使用 CASE WHEN
语句。
这个问题没有“正确”的答案。这完全取决于您的问题和数据的背景,但我只是提供了一些我用于解决您描述的相同问题的方法。
【讨论】:
是的,我正在考虑在我的测试集中创建一个包含所有缺失特征的虚拟观察。这样的痛苦。感谢您的帮助。 我还想补充一点,还有另一种方法称为hashing trick。它通常在 NLP 中采用,因为您可以拥有可能遇到不在训练语料库中的单词的语言模型。 Tensorflow 有很好的解释和特征散列的例子here。向下滚动到关于特征工程的部分。 Sklearn 还有一个用于进行特征哈希的模块。以上是关于训练和测试集中不同数量的特征 - 随机森林 sklearn Python的主要内容,如果未能解决你的问题,请参考以下文章
R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accurayF1偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机)