Regressão Linear Simples - Trabalho

Estudo de caso: Seguro de automóvel sueco

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:

  1. Número de reivindicações.
  2. Pagamento total para todas as reclamações em milhares de Kronor sueco.

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)


<bound method NDFrame.head of     numrei  pgtTotal
0      108     392.5
1       19      46.2
2       13      15.7
3      124     422.2
4       40     119.4
5       57     170.9
6       23      56.9
7       14      77.5
8       45     214.0
9       10      65.3
10       5      20.9
11      48     248.1
12      11      23.5
13      23      39.6
14       7      48.8
15       2       6.6
16      24     134.9
17       6      50.9
18       3       4.4
19      23     113.0
20       6      14.8
21       9      48.7
22       9      52.1
23       3      13.2
24      29     103.9
25       7      77.5
26       4      11.8
27      20      98.1
28       7      27.9
29       4      38.1
..     ...       ...
33       5      40.3
34      22     161.5
35      11      57.2
36      61     217.6
37      12      58.1
38       4      12.6
39      16      59.6
40      13      89.9
41      60     202.4
42      41     181.3
43      37     152.8
44      55     162.8
45      41      73.4
46      11      21.3
47      27      92.6
48       8      76.1
49       3      39.9
50      17     142.1
51      13      93.0
52      13      31.9
53      15      32.1
54       8      55.6
55      29     133.3
56      30     194.5
57      24     137.9
58       9      87.4
59      31     209.8
60      14      95.5
61      53     244.6
62      26     187.5

[63 rows x 2 columns]>

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)


    numrei  pgtTotal
0      108     392.5
1       19      46.2
2       13      15.7
3      124     422.2
4       40     119.4
5       57     170.9
6       23      56.9
7       14      77.5
8       45     214.0
9       10      65.3
10       5      20.9
11      48     248.1
12      11      23.5
13      23      39.6
14       7      48.8
15       2       6.6
16      24     134.9
17       6      50.9
18       3       4.4
19      23     113.0
20       6      14.8
21       9      48.7
22       9      52.1
23       3      13.2
24      29     103.9
25       7      77.5
26       4      11.8
27      20      98.1
28       7      27.9
29       4      38.1
..     ...       ...
33       5      40.3
34      22     161.5
35      11      57.2
36      61     217.6
37      12      58.1
38       4      12.6
39      16      59.6
40      13      89.9
41      60     202.4
42      41     181.3
43      37     152.8
44      55     162.8
45      41      73.4
46      11      21.3
47      27      92.6
48       8      76.1
49       3      39.9
50      17     142.1
51      13      93.0
52      13      31.9
53      15      32.1
54       8      55.6
55      29     133.3
56      30     194.5
57      24     137.9
58       9      87.4
59      31     209.8
60      14      95.5
61      53     244.6
62      26     187.5

[63 rows x 2 columns]

In [7]:
dataset.mean(numeric_only = True)


Out[7]:
numrei      22.904762
pgtTotal    98.187302
dtype: float64

In [8]:
x = dataset['numrei']
y = dataset['pgtTotal']
print(x)


0     108
1      19
2      13
3     124
4      40
5      57
6      23
7      14
8      45
9      10
10      5
11     48
12     11
13     23
14      7
15      2
16     24
17      6
18      3
19     23
20      6
21      9
22      9
23      3
24     29
25      7
26      4
27     20
28      7
29      4
     ... 
33      5
34     22
35     11
36     61
37     12
38      4
39     16
40     13
41     60
42     41
43     37
44     55
45     41
46     11
47     27
48      8
49      3
50     17
51     13
52     13
53     15
54      8
55     29
56     30
57     24
58      9
59     31
60     14
61     53
62     26
Name: numrei, Length: 63, dtype: int64

In [9]:
mean(x)
mean(y)


Out[9]:
98.18730158730159

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]:
GridSearchCV(cv=ShuffleSplit(n_splits=1, random_state=100, test_size=0.4, train_size=None),
       error_score='raise',
       estimator=DummyRegressor(constant=None, quantile=None, strategy='mean'),
       fit_params=None, iid=True, n_jobs=1,
       param_grid={'strategy': ['mean', 'median']},
       pre_dispatch='2*n_jobs', refit=True, return_train_score=True,
       scoring='neg_mean_squared_error', verbose=0)

In [13]:
cv.best_score_ * -1


Out[13]:
8787.5998097994034

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]:
GridSearchCV(cv=ShuffleSplit(n_splits=1, random_state=100, test_size=0.4, train_size=None),
       error_score='raise',
       estimator=LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False),
       fit_params=None, iid=True, n_jobs=1, param_grid={},
       pre_dispatch='2*n_jobs', refit=True, return_train_score=True,
       scoring='neg_mean_squared_error', verbose=0)

In [18]:
cv.best_score_ *-1


Out[18]:
1477.9873920103482

In [ ]: