Разделение набора данных для обучения и тестирования по строкам

Я хочу разделить свой набор данных на обучающие и тестовые наборы данных по годам. Идея состоит в том, чтобы поместить строки с годами от 2009-2017 в набор данных поезда и данные за 2018 год в набор тестовых данных. Разделить наборы данных по большей части было легко, но мои модели создают множество проблем с индексацией.

X = ((df[df['Year'] < 2018]))
X_train = np.array(X.drop(['Usage'], 1))
X_test = np.array(X['Usage'])
y =((df[df['Year'] > 2017]))
y_train = np.array(y.drop(['Usage'], 1))
y_test = np.array(y['Usage'])

Вот как я планирую разбивать данные. Столбец использования - это столбец моего прогноза, который содержит непрерывные значения. Применение простого RandomForestRegressor () дало мне эту ошибку взамен

ValueError: Number of labels=14495 does not match number of samples=382772

Адитья, моя модель регрессора была довольно простой, но я все равно прикрепляю код. в X передаются следующие столбцы: X = [Cust_Id ',' Usage ',' Plan_Group ',' Contract_Type ',' Cust_Status ',' Premise_Zip ',' Year ',' Month ']

model = RandomForestRegressor()

model.fit(X_train, y_train)

y_pred = model.predict(X_test)
# evaluate predictions
print(model.score(X_test, y_test))
# accuracy = accuracy_score(y_test, (y_pred < 0.5).astype(int))

person Fareen Walani    schedule 10.10.2018    source источник
comment
Какой у Вас вопрос?   -  person roganjosh    schedule 10.10.2018
comment
Я хочу разбить набор данных для обучения и тестирования по строкам. обычно вы определяете столбец как столбец прогноза и передаете его в y_test и y_train. в этом случае я хочу разбить его по строкам. Моя цель - спрогнозировать «Значения использования на 2018 год, обучив модель на данных 2009-2017 годов».   -  person Fareen Walani    schedule 10.10.2018
comment
@FareenWalani добавьте немного больше кода - возможно, строки, в которых вы вызываете RandomForestRegressor (). Я обнаружил грубую ошибку, которую вы здесь совершаете, но давайте возьмем более формальный способ переполнения стека. Мне интересно посмотреть, как вы используете параметры. И с самого начала получите представление о том, какие данные X содержит. Ваше понимание X и y становится немного нестабильным - вот в чем проблема.   -  person Aditya    schedule 10.10.2018
comment
@Aditya, я добавил код, который вы хотели, в свой ответ ниже   -  person Fareen Walani    schedule 10.10.2018


Ответы (1)


Для большинства алгоритмов в стеке sklearn у вас есть стандартная нотация: X, заглавная буква, обычно является массивом (даже если есть одна функция) и представляет каждую точку данных в векторной форме. y, строчная буква, обычно представляет собой вектор, обозначающий метки, например метка класса или значение элемента регрессии.

Вы создали X и Y как фрейм данных, сгенерированный атрибутом Year. Вместо этого вам нужно разделить на X_train и X_test.

X = df.drop(['Usage'],1)
X_train = df[df['Year'] < 2018]
X_test = df[df['Year'] > 2017]
y_train = df[df['Year'] < 2018]
y_test = df[df['Year'] > 2017]
y_train = y_train['Usage']
y_test = y_test['Usage']

А потом тренируешься на базе X_train и y_train

model = RandomForestRegressor()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

Но это не лучший способ. Вернусь, чтобы отредактировать ответ, но этого должно быть достаточно, чтобы вы начали.

person Aditya    schedule 10.10.2018
comment
невероятный! это творило для меня чудеса. Вы можете объяснить, что я здесь делал не так? а что ты сделал правильно? Я не понимаю, но как бы то ни было - person Fareen Walani; 10.10.2018
comment
Я понимаю. Вы, вероятно, следуете плохо написанному руководству. Помните - X - это матрица, y - это вектор. X - характеристики данных, y - метка. X - ввод, y - вывод. Любая модель model.fit () в sklearn принимает два параметра - входной и выходной. clf.fit (X, y) - стандартный способ. - person Aditya; 10.10.2018
comment
Еще одна вещь, связанная с stackoverflow, если вам нравится ответ, не забудьте проголосовать за него. Если ответ является лучшим в ветке, примите его как лучший (что вы уже сделали). Оба они важны, поскольку помогают нам поддерживать качество контента в stackoverflow. Голосование и принятие - лучшие способы поблагодарить и сохранить мотивацию проводить время вне рабочего дня, чтобы помочь другим коллегам, таким как вы. - person Aditya; 10.10.2018
comment
Я понимаю, что ADN именно это и сделает. еще одна вещь, я применил здесь как model.score, так и precision_score. model_score дает мне довольно приличные результаты, однако precision_score равен 0,0. я здесь что-то делаю не так или модель не поддерживает precision_score? - person Fareen Walani; 10.10.2018
comment
В регрессии вам понадобится R ^ 2 или что-то в этом роде. model.score (X_test, y_test) сделает именно это. Я не понимаю precision_score (). Как ты это называешь? - person Aditya; 10.10.2018
comment
да, я только что прочитал документацию, плохо. Спасибо за помощь! - person Fareen Walani; 10.10.2018