Как исправить ошибку «Количество функций» при попытке проверить мою случайную модель Форрест? - PullRequest
2 голосов
/ 26 апреля 2019

У меня есть обученная модель. Я хочу узнать, к какому классу относятся новые данные. Я провел несколько испытаний, но столкнулся с некоторыми проблемами.

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 Ответ

2 голосов
/ 26 апреля 2019

Я считаю, что вам нужно будет указать параметры в ваших данных, которые вы хотите использовать в качестве функций при обучении модели.Похоже, ваша модель обучения использует записи строк в качестве функций вместо каждого столбца.Это можно исправить, прочитав данные, а затем развернувшись и преобразовав их в 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 функций.

...