Я пытаюсь обучить модели линейной регрессии, используя sklearn, чтобы предсказать подобные твиты.У меня есть следующие функции / атрибуты.
['id', 'month', 'hour', 'text', 'hasMedia', 'hasHashtag', 'followers_count', 'retweet_count', 'favourite_count', 'sentiment', 'anger', 'anticipation', 'disgust', 'fear', 'joy', 'sadness', 'surprise', 'trust', ......keywords............]
Я использую tfidfvectorizer для извлечения ключевых слов.Проблема в том, что в зависимости от размера обучающих данных количество ключевых слов различается и, следовательно, количество независимых атрибутов различается.Из-за этого существует несоответствие атрибутов между данными обучения и тестирования.Я получаю ValueError: Форма переданных значений (1, 1678), индексы подразумевают (1, 1928) .
Это прекрасно работает, когда я разделяю одни и те же данные на поезд, тестирую и прогнозируюс тестом, как показано ниже.
Программа для обучения и прогнозирования
def train_favourite_prediction(result):
result = result.drop(['retweet_count'], axis=1)
result = result.dropna()
X = result.loc[:, result.columns != 'favourite_count']
y = result['favourite_count']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
regressor = LinearRegression()
regressor.fit(X_train, y_train)
# now you can save it to a file
joblib.dump(regressor, os.path.join(dirname, '../../knowledge_base/knowledge_favourite.pkl'))
return None
def predict_favourites(result):
result = result.drop(['retweet_count'], axis=1)
result = result.dropna()
X = result.loc[:, result.columns != 'favourite_count']
y = result['favourite_count']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
regressor = LinearRegression()
# and later you can load it
regressor = joblib.load(os.path.join(dirname, '../../knowledge_base/knowledge_favourite.pkl'))
coeff_df = pd.DataFrame(regressor.coef_, X.columns, columns=['Coefficient'])
print(coeff_df)
y_pred = regressor.predict(X_test)
df = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})
print(df)
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
print("the large training just finished")
return None
Код для векторизации подгонки
Посмотрите на ПрименяетсяTfidfvectorizer в списке pos-тегов дает ValueError , чтобы понять формат моего «текстового» столбца.
def ready_for_training(dataset):
dataset = dataset.head(1000)
dataset['text'] = dataset.text.apply(lambda x: literal_eval(x))
dataset['text'] = dataset['text'].apply(
lambda row: [item for sublist in row for item in sublist])
tfidf = TfidfVectorizer(tokenizer=identity_tokenizer, stop_words='english', lowercase=False)
keyword_response = tfidf.fit_transform(dataset['text'])
keyword_matrix = pd.DataFrame(keyword_response.todense(), columns=tfidf.get_feature_names())
keyword_matrix = keyword_matrix.loc[:, (keyword_matrix != 0).any(axis=0)]
dataset['sentiments'] = dataset['sentiments'].map(eval)
dataset = pd.concat([dataset.drop(['sentiments'], axis=1), dataset['sentiments'].apply(pd.Series)], axis=1)
dataset = dataset.drop(['neg', 'neu','pos'], axis=1)
dataset['emotions'] = dataset['emotions'].map(eval)
dataset = pd.concat([dataset.drop(['emotions'], axis=1), dataset['emotions'].apply(pd.Series)], axis=1)
dataset = dataset.drop(['id', 'month', 'text'], axis=1)
result = pd.concat([dataset, keyword_matrix], axis=1, sort=False)
return result
Что мне нужно, это предсказать 'favourite_count', когда дается новый одиночный твит.Когда я получаю ключевые слова для этого твита, я получаю только несколько.Во время обучения я тренировался с 1000+ ключевыми словами.Я сохранил обученные знания в файле .pkl. Как мне справиться с этим несоответствием атрибутов? Чтобы заполнить пропущенные столбцы в тестовом твите, как в Сохранить ту же фиктивную переменную в данных обучения и тестирования Мне может понадобиться набор обучения в качестве кадра данных.Но я сохранил обученные знания как .pkl.и не сможет получить доступ к колонкам в обученных знаниях.