尝试针对我的随机forrest模型进行测试时,如何解决“功能数量错误”?

时间:2019-04-26 19:57:49

标签: python machine-learning random-forest

我有训练有素的模型。我想找出新数据属于哪个类。我做了一些试验,但是遇到了一些问题。

with open('text_classifier', 'rb') as training_model:
model = pickle.load(training_model)
y_pred2 = model.predict(X_test)

此代码有效

但是...

 new_test_data=["spor toto süper lig 30. hafta medipol bu akşam ev göztepe 
ile saat 20.30'da başla mücadele suat arslanboğa arslanboğa yardımcı 
serka ok ve ismail şencan"]
tfidfconverter = TfidfVectorizer()
new_test_data = tfidfconverter.fit_transform(new_test_data).toarray()
model.predict(new_test_data)

我收到这样的错误

Number of features of the model must match the input. Model n_features is 9671 and input n_features is 25

我正在使用的代码块

data = load_files(r"...\docs",encoding="utf-8")
X, y = data.data, data.target
tfidfconverter = TfidfVectorizer(min_df=3, max_df=0.7)
X = tfidfconverter.fit_transform(X).toarray()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 
random_state=0)
classifier = RandomForestClassifier(n_estimators=1000, random_state=0)
classifier.fit(X_train, y_train)
y_pred2 = classifier.predict(X_test)

1 个答案:

答案 0 :(得分:2)

我相信您需要在训练模型时在数据中指定要实际用作功能的参数。看来您的训练模型正在使用行条目作为功能,而不是每列。可以通过以下方法解决此问题:读入数据,然后转过来将其转换为CSV,然后再次读入。但是,如果您已经知道数据的结构,则该步骤应该是不必要的。基本上,您只需要知道数据列的名称即可。您将需要使用Pandas模块进行此方法。这是一些代码...

    data = load_files(r"...\docs",encoding="utf-8")
    data.to_csv('train_data.csv', encoding = 'utf-8', index = False)

然后从CSV中读回训练数据...

    train_data = pd.read_csv('train_data.csv')

现在,当您调用train_test_split方法时,您应该指定要用作数据特征的内容。这通常是数据表中的列,因为这些是要收集的要分析的指标。我定义用于拆分数据的函数并构建用于指定特征的模型,因为我认为这更容易理解,但您也可以直接调用这些函数。

    def split_dataset(dataset, train_percentage, feature_headers, target_header):
        train_x, test_x, train_y, test_y = train_test_split(dataset[feature_headers], 
        dataset[target_header], train_size = train_percentage)
        return train_x, test_x, train_y, test_y

    def random_forest_classifier(features, target):
        model = RandomForestClassifier(n_estimators = 500, oob_score = True, n_jobs 
        =-1,random_state = 1, min_impurity_decrease = .01)
        model.fit(features, target)
        return model

现在您可以使用数据来调用函数了。

    train_x, test_x, train_y, test_y = split_dataset(train_data, 0.80, 
    train_data.columns[0:24], train_data.columns[-1])

    trained_model = random_forest_classifier(train_x,train_y)

您现在应该可以使用25种功能针对训练有素的模型进行预测。