2017-06-19 110 views
1

我使用sklearn包在Python,以适应随机森林回归模型的数据,看起来像这样:不同的脉络和特征数测试集 - 随机森林sklearn的Python

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

上周我在工作中遇到了同样的问题。我们处理这个问题的方式是在测试数据集中创建额外的特征,并用训练数据中的估算值填充它。

但是,当您开始进入dummifying类变量的领域时,您也可能会遇到问题。再次,我们使用的方法是将低基数的价值组合在一起。如果你从数据库中提取数据,你会想要实现这个解决方案是SQL,因为你想尽量减少Python中的数据处理,所以准备好使用CASE WHEN语句。

这个问题没有“正确的”答案。它将全部取决于您的问题和数据的上下文,但我只是提供某些方法,我用于您描述的相同问题。

+0

是的,我正在考虑在我的测试集中创建一个具有所有缺失功能的虚拟观察。这样的痛苦。谢谢您的帮助。 – myname

+1

我也想补充一点,有另一种方法称为[哈希技巧](https://www.quora.com/Can-you-explain-feature-hashing-in-an-easily-understandable-way)。它通常在NLP中被采用,因为你可能有语言模型可能会遇到不在训练语料库中的单词。 Tensorflow有一个很好的解释和功能哈希的例子[这里](https://www.tensorflow.org/tutorials/wide)。向下滚动到关于特征工程的部分。 Sklearn还有一个用于执行功能哈希的模块。 –