Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

python. Машинное обучение. Прогнозирование

#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'])

Комментариев нет:

Отправить комментарий