#python #machine-learning #scikit-learn
#python #машинное обучение #scikit-learn
Вопрос:
Итак, я использую случайный лес для этого набора данных: https://archive.ics.uci.edu/ml/datasets/auto миль на галлон
Но когда я пытаюсь что-то предсказать, он выдает эту ошибку:
Ошибка значения: количество функций модели должно соответствовать входным данным. Модель n_features равна 947, а входные данные n_features равны 15
это мои файлы:
import joblib # para salvar o modelo
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler # Para Normalizar
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import r2_score
data = pd.read_csv('auto-mpg.csv',sep = ',')
data['horsepower'] = data['horsepower'].replace('?','100')
x = data.iloc[:,1:].values
y = data.iloc[:,0].values
lb = LabelEncoder()
x[:,7] = lb.fit_transform(x[:,7])
onehot = OneHotEncoder()
x = onehot.fit_transform(x).toarray()
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size = 0.2,random_state = 0)
sc = StandardScaler()
x = sc.fit_transform(x)
rfr = RandomForestRegressor(n_estimators = 200,random_state = 0)
rfr.fit(xtrain,ytrain)
ypred_rfr = rfr.predict(xtest)
print('Acuracia:',round(r2_score(ytest,ypred_rfr)*100,2),'%')
joblib.dump(rfr,'randon-forest.model')
и здесь это приводит к ошибке:
import joblib # para salvar o modelo
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder
data = pd.read_csv('teste.csv',sep = ',')
print(data.columns);
logit = joblib.load('randon-forest.model')
onehot = OneHotEncoder()
data = onehot.fit_transform(data).toarray()
sc = StandardScaler()
data = sc.fit_transform(data)
# montar um vetor de dados
dados_vet = pd.DataFrame(data)
print(data)
# classificar esse vetor com o logit_bank
result_predict = logit.predict(dados_vet)
print('Logit Bank')
print(result_predict)
Ответ №1:
TL; DR:
данные, которые используются для прогнозирования, должны иметь то же количество функций, что и данные, которые использовались для обучения модели.
Более подробный ответ:
вы обучаете модель auto-mpg.csv
, в которой, я полагаю, содержится 947 функций (столбцов) ( 1 столбец в качестве значения тегирования). Однако данные в teste.csv
, которые я не знаю, что это такое, вероятно, содержат только 15 функций, следовательно, вы не можете предсказать данные 15 функций, используя модель, которая была обучена на другом количестве функций.
Простой пример: допустим, у вас есть модель, которая предсказывает цену дома с учетом года постройки дома и количества комнат, используя эту формулу:
price = number_of_rooms * 5 (year-2000) * 20
То, что вы пытаетесь сделать со своим кодом, эквивалентно предоставлению в этом примере модели только количества комнат. Модель также должна «знать» год.
Комментарии:
1. насколько она будет равна? Во втором файле я поместил 2 строки только для проверки
2. Не уверен, что вы подразумеваете под «оно будет равным»? что такое «это»? Каждая строка в новом файле (для прогнозирования) должна содержать такое же количество функций (947), которое использовалось в обучающих выборках. Поскольку это файл CSV, вам нужно что-то вроде: (строка 1) «1,2,3,4,5,…,946,947» ( линия 2) «1001,1002,…,1946,1947» Повторяется для 947 значений в каждой строке.
3. нет, в обоих файлах данные организованы по 9 столбцов. это одно и то же, разница лишь в том, что в одном у меня есть несколько регистров (для обучения), а в другом у меня только 2
4. ОК. Таким образом, поток, который вы используете для обработки обучающих данных, не совпадает с потоком данных, которые вы используете для прогнозирования. Я не очень знаком
LabelEncoder
, но похоже, что данные проходят через него во время обучения, а не во время предварительного прогнозирования. Я предлагаю отладить ваш код с помощьюx.shape[1]
иdata.shape[1]
посмотреть, на каком этапе разделяются фигуры.5. Еще одна проблема: вы должны быть осторожны при использовании методов fit_transform на этапе прогнозирования, поскольку он как подгоняет преобразователь к данным прогнозирования, так и преобразует данные. Это может быть нормально, но, например, вы устанавливаете новый масштабатор, используя данные прогнозирования — вы (обычно) должны использовать установленный масштабатор со стадии обучения. Не уверен насчет
LabelEncoder
иOneHotEncoder
, но я подозреваю, что с ними тоже следует быть более осторожными.