Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
训练集和测试集中不同数量的特性-随机森林学习Python_Python_Scikit Learn_Random Forest - Fatal编程技术网

训练集和测试集中不同数量的特性-随机森林学习Python

训练集和测试集中不同数量的特性-随机森林学习Python,python,scikit-learn,random-forest,Python,Scikit Learn,Random Forest,我使用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

我使用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']
对于每一行,第一个变量是输出变量,其他变量是feature:value对

我使用以下代码为数据创建稀疏矩阵:

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)
但是,我随后尝试使用训练集中的模型,使用以下代码获得测试集输出变量的预测:

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个特征的测试集,并且仍然可以得到一个预测?

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

然而,当您开始进入dummifing类变量的领域时,您也会遇到这个问题。同样,我们使用的方法是将基数较低的值分组到一个bucket中。如果要从数据库中提取数据,则需要实现此解决方案,即SQL,因为您希望尽可能减少Python中的数据处理,所以准备好使用
CASE WHEN
语句


这个问题没有“正确”的答案。这一切都取决于您的问题背景和数据,但我只是提供了一些方法,这些方法与您描述的问题相同。

是的,我正在考虑在测试集中创建一个虚拟观察,其中包含所有缺失的特性。真痛苦。谢谢你的帮助。我还想补充一点,还有另一种方法叫做。它在NLP中被普遍采用,因为你可以有语言模型,可以遇到训练语料库中没有的单词。Tensorflow对特征散列有很好的解释和示例。向下滚动至关于特征工程的部分。Sklearn还有一个模块用于进行特性哈希。