#python #machine-learning #linear-regression
Вопрос:
Используя данные, которые я нахожу в исходном df, я получаю некоторые приличные результаты с помощью линейной регрессии с использованием sklearn, но я читал, что, когда значения сильно отличаются, лучше нормализовать или стандартизировать. Я делаю это с помощью StandardScaler, но результаты выходят за рамки какой-либо логики. Пожалуйста, вы можете найти, где моя ошибка ??
import pandas as pd
insurance = pd.read_csv("./insurance2.csv")
insurance.head()
age sex bmi children smoker charges
0 19 1 27.900 0 1 16884.92400
1 18 0 33.770 1 0 1725.55230
2 28 0 33.000 3 0 4449.46200
3 33 0 22.705 0 0 21984.47061
4 32 0 28.880 0 0 3866.85520
X = insurance.drop(['charges'], axis = 1)
y = insurance.charges
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)
Линейная регрессия с данными в том виде, в каком они есть
from sklearn.linear_model import LinearRegression
MLR = LinearRegression(fit_intercept=False)
MLR.fit(X_train, y_train)
y_pred_MLR = MLR.predict(X_test)
results = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred_MLR})
results
Actual Predicted
1247 1633.9618 9692.885550
609 8547.6913 14503.324553
393 9290.1395 15207.774334
503 32548.3405 8435.748430
198 9644.2525 13019.558091
... ... ...
823 12523.6048 15787.241603
969 10702.6424 16050.896025
1326 9377.9047 15409.298487
792 21195.8180 13856.597356
634 14410.9321 18706.442066
from sklearn.metrics import r2_score
accuracy_MLR = r2_score(y_test, y_pred_MLR)
print("Accuracy con MLR: ", accuracy_MLR)
Accuracy con MLR: 0.13064545399288352
from math import sqrt
from sklearn.metrics import mean_squared_error
RMSE_MLR = sqrt(mean_squared_error(y_test, y_pred_MLR))
print("RMSE for Testing Data: ", RMSE_MLR)
RMSE for Testing Data: 11776.684328389369
LR со стандартными данными
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X2_train = sc.fit_transform(X_train)
X2_test = sc.transform(X_test)
MLR2 = LinearRegression(fit_intercept=False)
MLR2.fit(X2_train, y_train)
y_pred_MLR2 = MLR2.predict(X2_test)
results2 = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred_MLR2})
results2
Actual Predicted
1247 1633.9618 -7937.729692
609 8547.6913 -3397.232400
393 9290.1395 -2282.260721
503 32548.3405 13500.743967
198 9644.2525 -6194.481022
from sklearn.metrics import r2_score
accuracy_MLR2 = r2_score(y_test, y_pred_MLR2)
print("Accuracy con MLR: ", accuracy_MLR2)
Accuracy con MLR: -1.0909061875014818
from math import sqrt
from sklearn.metrics import mean_squared_error
RMSE_MLR2 = sqrt(mean_squared_error(y_test, y_pred_MLR2))
print("RMSE for Testing Data: ", RMSE_MLR2)
RMSE for Testing Data: 18263.829458461096
Комментарии:
1. Что дает вам такие значения, как «mse», «mae», «rmse» и т. Д.
2. обновил с этой информацией сообщение. Спасибо.
3. Есть какая-то особая причина, по которой вы подходите
fit_intercept=False
?4. На первых шагах (при анализе исходных данных) я обнаружил, что 2 переменные пересеклись на (0,0), поэтому я включил их. Запустите регрессию с и без fit_intercept=False и получите те же результаты. Но я только что обнаружил, после повторной проверки, что удаление fit_intercept в стандартной попытке дает те же результаты, что и в нестандартном наборе. Итак, если используется fit_intercept=False, я получаю действительно странные числа в стандартном наборе. Я fit_intercept=False удален, я получаю то же самое со стандартным или не стандартным.
5. может быть, это просто следствие попытки использовать линейный. Если LR все равно не может вместить данные, числа ведут себя именно так.