Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Um exercício de Machine Learning usando a base "Liberty Mutual Group: Property Inspection Prediction"

0 votos
25 visitas
perguntada Dez 19, 2020 em Dados e Bases de Dados por Camilaspinto (21 pontos)  

A Liberty Mutual Insurance é uma empresa de seguros que oferece diversos produtos e serviços projetados para atender às necessidades de seus clientes. Para se certificar de que o portfólio de seguro de imóveis está de acordo com os objetivos da companhia, esta realiza inspeção em propriedades recém-seguradas verificando fundação, piso, cobertura, janelas e outros atributos que permitem determinar se a propriedade é aquela que deseja assegurar.

No desafio lançado no kaggle (https://www.kaggle.com/c/liberty-mutual-group-property-inspection-prediction), a companhia disponibilizou diversos dados anônimos relacionados aos imóveis, a partir dos quais fosse possível mensurar o risco da propriedade antes da vistoria. O objetivo da empresa ao lançar o desafio foi obter modelo de predição que permitisse melhorar a acurácia na identificação de propriedades com maior risco, e, assim, a necessidade de verificações adicionais para essas.

Cada linha do banco de dados representa um imóvel inspecionado para o qual foi atribuída uma pontuação de “perigo”, a target. A ideia é que o modelo possa prever essa pontuação de “perigo” com os dados antes da inspeção (variáveis).

Para tal, a companhia disponibilizou dois bancos de dados, um para treino, com 50999 observações, e outro para teste, com 51000 observações.

Compartilhe

1 Resposta

0 votos
respondida Dez 19, 2020 por Camilaspinto (21 pontos)  

Nesta oportunidade será apresentada apenas uma análise inicial do problema e a tentativa de prever os dados por meio de dois modelos, sem análise aprofundada. Para isso, foi utilizado o python, iniciando-se com a importação das bibliotecas a serem utilizadas e a importação dos dados:

#importando as bibliotecas
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression 
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import KNeighborsClassifier
from sklearn import model_selection
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_log_error
from sklearn.model_selection import train_test_split
%matplotlib inline

#importando os dados
df_train = pd.read_csv('train_liberty.csv')
df_test = pd.read_csv('test_liberty.csv')

Com os comandos abaixo verificou-se que a base de teste não traz a target 'Hazard". Assim, optou-se considerar apenas a base de dados de treino, tanto para a etapa de treino quanto para a etapa de teste. Verificou-se também a inexistência de valores faltantes dentre as 50999 observações da base de treino, um total de 32 variáveis, sendo 16 numéricas, aparentemente, e 16 categóricas.

#verificando as variáveis em cada base de dados
print(df_train.columns, df_test.columns)

#verificando dados da base de treino
df_train.set_index('Id', inplace=True)
print(df_train.shape) # 50999 observações, target mais 32 variáveis
print(df_train.count()) # Sem NA
print(df_train['Hazard'].value_counts())

print(df_train.describe(include='all'))

#separando as variáveis
target = 'Hazard'
variaveis = ['T1_V1', 'T1_V2', 'T1_V3', 'T1_V4', 'T1_V5', 'T1_V6', 'T1_V7',
             'T1_V8', 'T1_V9', 'T1_V10', 'T1_V11', 'T1_V12', 'T1_V13', 'T1_V14',
             'T1_V15', 'T1_V16', 'T1_V17', 'T2_V1', 'T2_V2', 'T2_V3', 'T2_V4',
             'T2_V5', 'T2_V6', 'T2_V7', 'T2_V8', 'T2_V9', 'T2_V10', 'T2_V11',
             'T2_V12', 'T2_V13', 'T2_V14', 'T2_V15']

variaveisNumericas = ['T1_V1', 'T1_V2', 'T1_V3', 'T1_V10', 'T1_V13', 'T1_V14', 
                      'T2_V1', 'T2_V2', 'T2_V4', 'T2_V6', 'T2_V7', 'T2_V8', 'T2_V9', 'T2_V10', 'T2_V14', 'T2_V15']

variaveisCategoricas = ['T1_V4', 'T1_V5', 'T1_V6', 'T1_V7', 'T1_V8', 'T1_V9', 'T1_V11', 'T1_V12', 'T1_V15', 'T1_V16', 'T1_V17',
                        'T2_V3', 'T2_V5', 'T2_V11', 'T2_V12', 'T2_V13']

Em seguida, buscou-se conhecer melhor a target, que apresenta maior frequência de valores entre 1 e 8, passando à frequência ínfima quando atinge valor a partir de 30, e as variáveis anônimas, aparentemente sendo as numéricas discretas, em sua maioria, variando entre valores baixos (o que pode representar quantidade de cômodos, de pessoas que residem no imóvel etc).

#verificando target
print(f'Média: {df_train.Hazard.mean()}, desvio padrão: {df_train.Hazard.std()}')
df_train['Hazard'].plot.hist() #a maior parte da pontuação de perigo varia entre 1 e 8
df_train['Hazard'].plot.box()

#verificando variáveis numéricas
df_train[variaveisNumericas].plot.box()
plt.xticks(rotation=45)

#vendo algumas variáveis separadamente
df_train[['T1_V3']].plot.box(), df_train[['T1_V14']].plot.box(), df_train[['T2_V1']].plot.box(),
df_train[['T2_V6']].plot.box(), df_train[['T2_V8']].plot.box(), df_train[['T2_V14']].plot.box()  
print(df_train['T1_V3'].value_counts(), df_train['T1_V14'].value_counts(),
      df_train['T2_V1'].value_counts(), df_train['T2_V6'].value_counts(), 
      df_train['T2_V8'].value_counts(), df_train['T2_V14'].value_counts())

A imagem será apresentada aqui.

A imagem será apresentada aqui.

A seguir, seguem comandos para transformação das variáveis categóricas em variáveis dummies, passando ao todo de 32 para 112 variáveis

#transformando as variáveis categóricas em variáveis dummies
df_train_ = pd.get_dummies(df_train.copy(), columns=variaveisCategoricas)
variaveisIndependentes = list(df_train_.columns)
variaveisIndependentes.remove('Hazard')
variaveisIndependentes
df_train_.shape #a quantidade de variáveis passou de 32 para 112

Abaixo segue classe criada com função definida para separação dos dados entre dados para treino e para teste, bem como função para executar o treino e prever a target para posterior plot dos resultados:

class PrevisaoLiberty:
    def __init__(self, df, target, listaVariaveis):
        self.df=df
        self.target=target
        self.listaVariaveis=listaVariaveis
        self.X=df[listaVariaveis]
        self.y=df[target]


    def separaTreinoTeste(self, percTeste, semente):
        X_train, X_test, y_train, y_test = train_test_split(self.X, self.y, test_size=percTeste, random_state=semente)
        self.X_train = X_train.values.tolist()
        self.X_test = X_test.values.tolist()
        self.y_train = y_train.tolist()
        self.y_test = y_test.tolist()


    def graficosPrevisao(self, dicionarioModelos):
        for nome, modelo in dicionarioModelos.items():
            modelo.fit(self.X_train,self.y_train)
            y_pred = modelo.predict(self.X_test)
            plt.plot(self.y_test, color='blue')
            plt.plot(y_pred , color='red')
            plt.show()
            print(nome, 'R Quadrado', r2_score(self.y_test, y_pred))

A imagem será apresentada aqui.

...