#python #машинное_обучение #scikit_learn #xgboost
Доброго времени суток. Занимался задачами регрессии с использование sclearn и xgboost. Однако задача прогнозирования слегка отличается, можете ли вы привести пример в каком виде должны быть данные и пример кода на python для работы c использование xgboost. В задачах регрессии я подобным образом собирал данные в виде подобного набора строк 1;34;234;234;123;2;321;2;123213;24534;3;278 Где входной вектор был n-1 параметров, а предсказываемое значение - последний столбец. Насколько я понимаю в задачах прогнозирования, сама строка это один и тот же параметр который изменяется во времени, в то время как в задачах регрессии несколько различных параметров по которым предсказываем один. Вопрос - чем отличаются задачи планирования и регрессии на уровне программирования? Т.е. входные данные имеют вид x0 x1 x2 x3 x4 x5 y 0.392689 0.117810 0.242750 0.931792 0.972802 0.898693 0.429941 0.569055 0.622889 0.762683 0.095271 0.101407 0.510155 0.542256 0.939509 0.993534 0.772005 0.164555 0.800897 0.591883 0.190720 0.284297 0.292773 0.290652 0.045383 0.564894 0.347683 0.014610 где мы предсказываем значение y. И данные имею такой вид: x1 0.284297 0.292773 0.290652 0.045383 0.564894 0.347683 0.014610 0.961696 x2 0.939509 0.993534 0.772005 0.164555 0.800897 0.591883 0.190720 0.040162 где надо предсказать дальнейшие значения x1, x2, .. в чем отличие в плане кода? import xgboost as xgb import pandas as pd import numpy as np import math from sklearn.metrics import confusion_matrix, mean_squared_error from sklearn.datasets import load_iris, load_digits, load_boston from sklearn.metrics import mean_absolute_error,mean_squared_error,median_absolute_error, accuracy_score df = pd.read_csv('file1.csv',";",header=None) X_train = df.drop(7,axis=1) Y_train = df[7] test_data = pd.read_csv('file2.csv',";",header=None) X_test = test_data.drop(7,axis=1) Y_test = test_data[7] xgb_model = xgb.XGBRegressor(max_depth) cl = xgb_model.fit(X_train,Y_train) predictions = cl.predict(X_test) actuals = Y_test print(mean_absolute_error(actuals, predictions)) print(mean_squared_error(actuals, predictions)) print(median_absolute_error(actuals, predictions)) Условно данный код, одинаково будет предсказывать и дальнейшее значение x1 для второй выборки и y - для первой?
Ответы
Ответ 1
Ответ на вопрос до правки как разбивать на обучающую и проверочную выборку? Для таких задач идеально подходят модули Pandas и Numpy, которые позволяют работать без циклов (векторизированные решения) с целыми матрицами и векторами, что на порядки быстрее по сравнению с обработкой в циклах. Вот небольшой пример: import pandas as pd import numpy as np # generate random DataFrame (shape: 10, 8) In [13]: df = pd.DataFrame(np.random.rand(10,8)).add_prefix('x') In [14]: df.columns = df.columns[:-1].tolist() + ['y'] In [15]: df Out[15]: x0 x1 x2 x3 x4 x5 x6 y 0 0.392689 0.117810 0.242750 0.931792 0.972802 0.898693 0.429941 0.619093 1 0.569055 0.622889 0.762683 0.095271 0.101407 0.510155 0.542256 0.848998 2 0.939509 0.993534 0.772005 0.164555 0.800897 0.591883 0.190720 0.040162 3 0.284297 0.292773 0.290652 0.045383 0.564894 0.347683 0.014610 0.961696 4 0.065868 0.974128 0.749756 0.778895 0.872915 0.585320 0.851837 0.408333 5 0.818768 0.343451 0.985583 0.860080 0.876103 0.554149 0.132387 0.506820 6 0.713177 0.567278 0.587488 0.459199 0.082245 0.677964 0.229960 0.265138 7 0.751670 0.902665 0.353395 0.975563 0.823437 0.742916 0.760047 0.567249 8 0.106809 0.068440 0.075260 0.435980 0.412090 0.226181 0.909518 0.714608 9 0.281475 0.641496 0.695424 0.993351 0.958840 0.457999 0.203841 0.007968 теперь мы можем нарезать данные так как нам удобно Например если нам нужны все столбцы кроме последнего: In [16]: df.iloc[:, :-1] Out[16]: x0 x1 x2 x3 x4 x5 x6 0 0.392689 0.117810 0.242750 0.931792 0.972802 0.898693 0.429941 1 0.569055 0.622889 0.762683 0.095271 0.101407 0.510155 0.542256 2 0.939509 0.993534 0.772005 0.164555 0.800897 0.591883 0.190720 3 0.284297 0.292773 0.290652 0.045383 0.564894 0.347683 0.014610 4 0.065868 0.974128 0.749756 0.778895 0.872915 0.585320 0.851837 5 0.818768 0.343451 0.985583 0.860080 0.876103 0.554149 0.132387 6 0.713177 0.567278 0.587488 0.459199 0.082245 0.677964 0.229960 7 0.751670 0.902665 0.353395 0.975563 0.823437 0.742916 0.760047 8 0.106809 0.068440 0.075260 0.435980 0.412090 0.226181 0.909518 9 0.281475 0.641496 0.695424 0.993351 0.958840 0.457999 0.203841 или все столбцы начинающиеся с x: In [17]: df.filter(regex='^x\d+') Out[17]: x0 x1 x2 x3 x4 x5 x6 0 0.392689 0.117810 0.242750 0.931792 0.972802 0.898693 0.429941 1 0.569055 0.622889 0.762683 0.095271 0.101407 0.510155 0.542256 2 0.939509 0.993534 0.772005 0.164555 0.800897 0.591883 0.190720 3 0.284297 0.292773 0.290652 0.045383 0.564894 0.347683 0.014610 4 0.065868 0.974128 0.749756 0.778895 0.872915 0.585320 0.851837 5 0.818768 0.343451 0.985583 0.860080 0.876103 0.554149 0.132387 6 0.713177 0.567278 0.587488 0.459199 0.082245 0.677964 0.229960 7 0.751670 0.902665 0.353395 0.975563 0.823437 0.742916 0.760047 8 0.106809 0.068440 0.075260 0.435980 0.412090 0.226181 0.909518 9 0.281475 0.641496 0.695424 0.993351 0.958840 0.457999 0.203841 разделяем набор данных на обучающую и проверочную выборки, предварительно перетасовав данные случайным образом: In [19]: df_train, df_test = np.split(df.sample(frac=1), [6]) In [20]: df_train Out[20]: x0 x1 x2 x3 x4 x5 x6 y 3 0.284297 0.292773 0.290652 0.045383 0.564894 0.347683 0.014610 0.961696 2 0.939509 0.993534 0.772005 0.164555 0.800897 0.591883 0.190720 0.040162 9 0.281475 0.641496 0.695424 0.993351 0.958840 0.457999 0.203841 0.007968 1 0.569055 0.622889 0.762683 0.095271 0.101407 0.510155 0.542256 0.848998 8 0.106809 0.068440 0.075260 0.435980 0.412090 0.226181 0.909518 0.714608 7 0.751670 0.902665 0.353395 0.975563 0.823437 0.742916 0.760047 0.567249 In [21]: df_test Out[21]: x0 x1 x2 x3 x4 x5 x6 y 4 0.065868 0.974128 0.749756 0.778895 0.872915 0.585320 0.851837 0.408333 0 0.392689 0.117810 0.242750 0.931792 0.972802 0.898693 0.429941 0.619093 6 0.713177 0.567278 0.587488 0.459199 0.082245 0.677964 0.229960 0.265138 5 0.818768 0.343451 0.985583 0.860080 0.876103 0.554149 0.132387 0.506820 PS практически все известные мне библиотеки по машинному обучению принимают в качестве входных данных Pandas.DataFrame's, Pandas.Series, Numpy.Arra's. Т.е. что-то вроде: clf = xgb.XGBClassifier(...) clf.fit(df_train.filter(regex='^x'), df_train.loc[:, 'y'])
Комментариев нет:
Отправить комментарий