Agora, sabemos como implementar um modelo de regressão linear simples. Vamos aplicá-lo ao conjunto de dados do seguro de automóveis sueco. Esta seção assume que você baixou o conjunto de dados para o arquivo insurance.csv, o qual está disponível no notebook respectivo.
O conjunto de dados envolve a previsão do pagamento total de todas as reclamações em milhares de Kronor sueco, dado o número total de reclamações. É um dataset composto por 63 observações com 1 variável de entrada e 1 variável de saída. Os nomes das variáveis são os seguintes:
Voce deve adicionar algumas funções acessórias à regressão linear simples. Especificamente, uma função para carregar o arquivo CSV chamado load_csv (), uma função para converter um conjunto de dados carregado para números chamado str_column_to_float (), uma função para avaliar um algoritmo usando um conjunto de treino e teste chamado split_train_split (), a função para calcular RMSE chamado rmse_metric () e uma função para avaliar um algoritmo chamado evaluate_algorithm().
Utilize um conjunto de dados de treinamento de 60% dos dados para preparar o modelo. As previsões devem ser feitas nos restantes 40%.
Compare a performabce do seu algoritmo com o algoritmo baseline, o qual utiliza a média dos pagamentos realizados para realizar a predição ( a média é 72,251 mil Kronor).
In [1]:
import pandas as pd
import numpy as np
In [3]:
columns = ['numrei','pgtTotal']
dataset = pd.read_csv('insurance.csv' ,header = None, names = columns)
print(dataset.head)
In [4]:
# Calculate the mean value of a list of numbers
def mean(values):
return sum(values) / float(len(values))
# Calculate the variance of a list of numbers
def variance(values, mean):
return sum([(x-mean)**2 for x in values])
# Calculate covariance between x and y
def covariance(x, mean_x, y, mean_y):
covar = 0.0
for i in range(len(x)):
covar += (x[i] - mean_x) * (y[i] - mean_y)
return covar
# Calculate coefficients
def coefficients(dataset):
x = [row[0] for row in dataset]
y = [row[1] for row in dataset]
x_mean, y_mean = mean(x), mean(y)
b1 = (covariance(x, x_mean, y, y_mean) / variance(x, x_mean))
b0 = y_mean - b1 * x_mean
return [b0, b1]
def simple_linear_regression(train, test):
predictions = list()
b0, b1 = coefficients(train)
for row in test:
ypred = b0 + b1 * row[0]
predictions.append(ypred)
return predictions
from math import sqrt
# Calculate root mean squared error
def rmse_metric(actual, predicted):
sum_error = 0.0
for i in range(len(actual)):
prediction_error = predicted[i] - actual[i]
sum_error += (prediction_error ** 2)
mean_error = sum_error / float(len(actual))
return sqrt(mean_error)
# Evaluate regression algorithm on training dataset
def evaluate_algorithm(dataset, algorithm):
test_set = list()
for row in dataset:
row_copy = list(row)
row_copy[-1] = None
test_set.append(row_copy)
predicted = algorithm(dataset, test_set)
print(predicted)
actual = [row[-1] for row in dataset]
rmse = rmse_metric(actual, predicted)
return rmse
In [5]:
dataset['numrei'] = pd.to_numeric(dataset['numrei'], errors='coerce').fillna(0)
dataset['pgtTotal'] = pd.to_numeric(dataset['pgtTotal'], errors='coerce').fillna(0)
In [6]:
print(dataset)
In [7]:
dataset.mean(numeric_only = True)
Out[7]:
In [8]:
x = dataset['numrei']
y = dataset['pgtTotal']
print(x)
In [9]:
mean(x)
mean(y)
Out[9]:
In [10]:
from sklearn.model_selection import train_test_split
In [11]:
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.4)
In [12]:
from sklearn.dummy import DummyRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import ShuffleSplit
dm = DummyRegressor()
param_grid = {"strategy": ["mean", "median"]}
ss = ShuffleSplit(n_splits=3, test_size=.4, random_state=100)
cv = GridSearchCV(dm, cv=ss, param_grid=param_grid, scoring="neg_mean_squared_error")
cv.fit(dataset[['numrei']], dataset['pgtTotal'])
Out[12]:
In [13]:
cv.best_score_ * -1
Out[13]:
In [16]:
from sklearn.linear_model import LinearRegression
import math
ln = LinearRegression()
cv = GridSearchCV(ln, param_grid = {}, cv=ss, scoring="neg_mean_squared_error")
cv.fit(dataset[['numrei']], dataset['pgtTotal'])
Out[16]:
In [18]:
cv.best_score_ *-1
Out[18]:
In [ ]: