Найти - Пользователи
Полная версия: Тестирование регрессии в scikit-learn
Начало » Python для экспертов » Тестирование регрессии в scikit-learn
1
kordDem
Добрый день. Написал программу, которая по данным из первого файла пытается предугадать данные из другого файла. Пример строки из файлов:
1;81.7474;1268.5;122.85;46.9;64.95;823.69;55.64;18.54;3;4;1.2;0.7;1045;915.68;890.54;12;35;36420
первые 17 столбцов признаки, 18 столбец желаемое значение.
По результатам тестирования у меня выдает такие данные:
Accuracy: 30535102968705.60%
Accuracy: 17282909.55%
Accuracy: 8681055.47%
Мб я где-то накосячил в программе? Или не до конца уловил механизм scikit-learn?
Пример программы:
 import pandas as pd
import xgboost as xgb
from sklearn.metrics import confusion_matrix, mean_squared_error
from sklearn.metrics import mean_absolute_error,mean_squared_error,median_absolute_error
df = pd.read_csv('new_work_1.csv',";",header=None)
X_train = df.drop(18,axis=1)
Y_train = df[18]
T_train_xgb = xgb.DMatrix(X_train, Y_train)#
params = {"objective": "reg:linear", "booster":"gblinear"}
gbm = xgb.train(dtrain=T_train_xgb,params=params)
test_data = pd.read_csv('new_work_2.csv',";",header=None)
#print(test_data)
X_test = test_data.drop(18,axis=1)
Y_test = test_data[18]
Y_pred = gbm.predict(xgb.DMatrix(X_test))
test_erorr = mean_squared_error(Y_test,Y_pred);
print("Accuracy: %.2f%%" % (test_erorr * 100.0))	
accuracy = mean_absolute_error(Y_test,Y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
accuracy2 = median_absolute_error(Y_test, Y_pred)
print("Accuracy: %.2f%%" % (accuracy2 * 100.0))
noob_saibot
1. Accuracy это метрика не для регрессии, а классификации. и найти её можно:
 from sklearn.metrics import accuracy_score
(ACC = (TP + TN) / (TP + TN + FP + FN))

2. Вы же находите не accuracy, на 100 домножать не надо.
3. Покажите какие значения на тренировочном сете.
4. Данные можете скинуть протестить?

Возможно ошибки и нет, пока не хватает информации.

kordDem
1) Да знаю, просто пытался хоть сколько-нибудь похожие на правду результаты получить.
Скидываю ссылки на файлики
https://yadi.sk/d/_x3P3NLJ3JPmBR
https://yadi.sk/d/EMTemyU_3JPmBz
Данные получившиеся на тренировочном сете, такое ощущение что надо не линейную регрессию, а что-то другое
14770.64453125 16676.65234375 18582.65234375 20488.66015625
22394.66796875 24300.67578125 26206.68359375 28112.6953125
30018.69921875 31924.69921875 33830.70703125 35736.71484375
37642.72265625 39548.72265625 41454.73828125 43360.73828125
45266.7421875 47172.7578125 49078.7578125 50984.7578125
52890.7734375 54796.7734375 56702.7890625 58608.7890625
60514.7890625 62420.8046875 64326.8203125 66232.8203125
68138.8203125 70044.828125 71950.828125 73856.84375
75762.84375 77668.84375 79574.859375 81480.859375
83386.875 85292.875 87198.875 89104.890625
91010.90625 92916.90625 94822.90625 96728.90625
98634.921875 100540.9375 102446.9453125 104352.953125
106258.953125 108164.96875 110070.984375 111976.984375
113882.984375 115789. 117695. 119601.015625
121507.015625 123413.015625 125319.03125 127225.046875
129131.046875 131037.046875 132943.046875 134849.046875
136755.078125 138661.078125 140567.078125 142473.078125
144379.078125 146285.109375 148191.109375 150097.109375
152003.109375 153909.109375 155815.140625 157721.140625
159627.125 161533.125 163439.125 165345.15625
167251.171875 169157.171875 171063.171875 172969.171875
174875.203125 176781.203125 178687.203125 180593.203125
182499.234375 184405.234375 186311.25 188217.28125
190123.28125 192029.28125 193935.28125 195841.28125
197747.28125 199653.28125
kordDem
Немного поменял код Решил попробовать класс regressor. Подскажите насколько адекватны стали значения и какие еще параметры можно попробовать улучшить
 import xgboost as xgb
import pandas as pd
import numpy as np
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
rng = np.random.RandomState(31337)
print("Boston Housing: regression")
df = pd.read_csv('new_work_1.csv',";",header=None)
X_train = df.drop(18,axis=1)
Y_train = df[18]
test_data = pd.read_csv('new_work_2.csv',";",header=None)
#print(test_data)
X_test = test_data.drop(18,axis=1)
Y_test = test_data[18]
xgb_model = xgb.XGBRegressor(max_depth=2, learning_rate=0.6, n_estimators=800)
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))
print("============================")
значения на выходе:
Boston Housing: regression
7540.91252541
830688195.286
1698.83728027
noob_saibot
1. Было
kordDem
params = {“objective”: “reg:linear”, “booster”:“gblinear”}
Вы не изменили алгоритм регрессии (за исключением глубины деревьев, их количества и lr), так как эти значения и были дефолтными:
“class xgboost.XGBRegressor(max_depth=3, learning_rate=0.1, n_estimators=100, silent=True, objective='reg:linear', booster='gbtree', n_jobs=1, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0, subsample=1, colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, base_score=0.5, random_state=0, seed=None, missing=None, **kwargs)”

2. Не могу сказать на сколько эта оценка адекватна. Постройте график по y_true и y_pred и сравните, устроит вас такая точность или нет. В идеале у вас должен быть 0, вот и прикиньте)) (То есть бизнесу нужен 0, а вот насколько близко вы сможете к нему приблизиться это вопрос, поэтому сказать плоха ваша оценка или нет, я не могу).

3. Так же, вам необходимо с чем то сравнивать. Разбейте тренировочную выборку на трейн и тест.

Пример:
 from sklearn.ensemble import ExtraTreesRegressor
import pandas as pd
import seaborn
import matplotlib.pyplot as plt
from sklearn.metrics import mean_absolute_error,mean_squared_error,median_absolute_error
print("Boston Housing: regression")
df = pd.read_csv('new_work_1.csv',";",header=None)
df_test = df[284000:]
df = df[:284000]
X_train = df.drop(18, axis=1)
Y_train = df[18]
X_test = df_test.drop(18, axis=1)
Y_test = df_test[18]
model = ExtraTreesRegressor()
cl = model.fit(X_train, Y_train)
predictions = pd.Series(cl.predict(X_test))
actuals = Y_test.reset_index(drop=True)
seaborn.set_style()
df_rs = pd.concat([predictions, actuals], axis=1)
df_rs.plot(subplots=True)
print(mean_absolute_error(actuals, predictions))
print(mean_squared_error(actuals, predictions))
print(median_absolute_error(actuals, predictions))
plt.show()

PS. можно закоментить seaborn, если нет эелания ставить.
PSS. Это временные ряды, почитайте как с ними работать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB