Чрезвычайно высокое среднеквадратическое отклонение при тестировании на линейную регрессиюPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Чрезвычайно высокое среднеквадратическое отклонение при тестировании на линейную регрессию

Сообщение Anonymous »

Код: Выделить всё

import numpy as np
import pandas as pd

pd.set_option('future.no_silent_downcasting', True)

class LinearRegression:
def __init__(self, x_train, y_train, epochs=20, alpha=0.01):
self.x_train = pd.DataFrame(x_train)
self.y_train = pd.DataFrame(y_train).values.reshape(-1, 1)
self.shape = x_train.shape
self.x_scale_factor = self.x_train.max(axis=0)
self.y_scale_factor = self.y_train.max()
self.x_train /= self.x_scale_factor
self.y_train /= self.y_scale_factor
self.weight_matrix = np.random.rand(1, self.shape[1])
self.bias_matrix = np.random.rand(1, 1)
self.epochs = epochs
self.alpha = alpha
self.error = 0

def train(self):
for i in range(self.epochs):
predictions = np.dot(self.x_train, self.weight_matrix.T) + self.bias_matrix
error_matrix = ((self.y_train - predictions) ** 2) / self.shape[0]
self.error = np.sum(error_matrix)
weight_gradient = -2 * np.dot((self.y_train - predictions).T, self.x_train) / self.shape[0]
bias_gradient = -2 * np.mean(self.y_train - predictions)
self.weight_matrix -= self.alpha * weight_gradient
self.bias_matrix -= self.alpha * bias_gradient

if i % 10 == 0:
print(f"Epoch {i} \t error: {self.error}")
print(self.weight_matrix)
print(self.bias_matrix)

def predict(self, x_features):
x_features = pd.DataFrame(x_features)
x_features /= self.x_scale_factor
y_predictions = np.dot(x_features, self.weight_matrix.T) + self.bias_matrix
y_predictions *= self.y_scale_factor
return y_predictions

def evaluate(self, x_test, y_test):
x_test, y_test = pd.DataFrame(x_test), pd.DataFrame(y_test).values.reshape(-1, 1)
x_test /= self.x_scale_factor
y_predict = self.predict(x_test)
rmse = np.sqrt(np.mean((y_predict - y_test) ** 2))
return rmse

# Example usage
train_data = pd.read_csv('Dataset/House price/df_train.csv')
train_data = train_data.drop('date', axis=1)
x_train = train_data.drop(columns=['price']).sample(frac=1)
x_train = x_train.replace({True: 1, False: 0}).astype(int)
y_train = train_data['price'].sample(frac=1)
model = LinearRegression(x_train, y_train, epochs=500, alpha=0.1)
model.train()

test_data = pd.read_csv('Dataset/House price/df_test.csv')
x_test = test_data.drop(columns=['price', 'date'])
x_test = x_test.replace({True: 1, False: 0}).astype(int)
y_test = test_data['price']

print(f"Root Mean Squared Error: {model.evaluate(x_test, y_test)}")
Сценарий приводит к очень высокому RMSE во время процесса оценки, но к прилично низкому MSE во время обучения. Дополнительную информацию см. на прикрепленном изображении.
Изображение

Я попробовал отредактировать функцию оценки, включив в нее и другие функции ошибок. Точность тоже равна нулю.
Набор данных:

Код: Выделить всё

date,price,bedrooms,grade,has_basement,living_in_m2,renovated,nice_view,perfect_condition,real_bathrooms,has_lavatory,single_floor,month,quartile_zone
2014-09-26,305000.0,2,1,False,76.18046,False,False,True,1,False,True,9,2
2014-05-14,498000.0,3,2,True,210.88981,False,False,False,2,True,True,5,2
2015-03-23,590000.0,2,4,False,262.91549,False,False,False,2,True,False,3,2
2014-07-15,775000.0,3,3,False,159.79316,False,False,False,1,True,False,7,3
2015-04-14,350000.0,2,1,False,92.903,False,False,False,1,True,True,4,3
2015-05-08,399000.0,2,2,False,201.59951,False,False,False,1,True,True,5,1
2014-10-15,325000.0,1,2,False,94.76106,False,False,False,1,True,False,10,3
2014-07-15,250000.0,3,2,True,177.44473,False,False,False,2,True,True,7,1
2015-02-25,445000.0,3,2,False,360.46364,False,False,False,3,False,False,2,2
2014-07-01,459500.0,1,2,True,116.12875,False,False,False,1,False,True,7,3
2015-03-25,292500.0,2,2,False,194.631785,False,False,False,2,True,False,3,1
2015-04-24,172500.0,1,1,True,140.28353,False,False,False,2,False,True,4,2
2014-05-14,372977.0,2,3,True,157.00607,False,False,False,2,True,False,5,3
2014-08-29,452000.0,1,1,True,113.34166,False,False,False,1,False,True,8,2
2014-10-09,500000.0,2,3,True,160.72219,False,False,False,2,True,True,10,4
2015-01-19,250000.0,3,2,True,203.45757,False,True,False,1,True,True,1,1
2014-08-19,790000.0,3,3,True,208.10272,False,False,True,2,True,True,8,4
2014-06-06,160000.0,2,1,False,112.41263,True,False,False,1,False,True,6,3
2014-10-06,529950.0,1,3,True,139.3545,False,False,False,2,True,False,10,3
Это несколько верхних строк набора данных, который я использую. Это набор данных для прогнозирования цен на жилье, который имеет 14 функций и 1 метку. Я заметил, что некоторые значения цены, предсказанные моделью, отрицательны. Возможно, это причина высокого RMSE. Как я могу решить эту проблему?

Подробнее здесь: https://stackoverflow.com/questions/791 ... regression
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»