Несоответствие атрибутов между данными обучения и тестирования в sklearn - линейная регрессия - PullRequest
0 голосов
/ 12 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...