Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Como fazer "resampling"/balancemanto de classes em um problema de regressão em machine learning com Python?

Problema usando o dataset do livro "Hands-On Machine Learning with Scikit-Learn and TensorFlow"

https://github.com/ageron/handson-ml

dataset de preços de casas. Objetivo: criar uma modelo de previsao de preços de casas

Obtive o histograma abaixo: https://imgur.com/a/ETWVew1

Dá para ver que há um "desbalanceamento" de preços das casas.

Fazer "resampling" com 2 classes/classificacao é relativamente fácil. Agora como fazer o mesmo no problema acima, em que a classe não é binária? Cada valor de casa é uma classe...

Código fonte (é um jupyter notebook):

#!/usr/bin/env python
# coding: utf-8

import sys #ver python path
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


get_ipython().run_line_magic('matplotlib', 'inline')

housing = pd.read_csv('/Dados/Estudo_ML/handson-ml-master/datasets/housing/housing.csv',dtype={"srcip":object ,})

housing.head(20)

# # Análise de dados exploratória e Pré-processamento
# 

#quero prever "median_house_value"


vars = ['longitude', 'latitude','housing_median_age','total_rooms','total_bedrooms',
       'population','households','median_income']

sns.pairplot(housing)

housing['median_house_value']#a classe!

housing

housing.isna().sum()


# Podemos ver que os dados faltantes estão exclusivamente na coluna 'total_bedrooms'


housing.isnull().sum()


housing['total_bedrooms']


fig, ax = plt.subplots(figsize=(10,10))
sns.heatmap(housing.isnull(),yticklabels=False,cbar=False,cmap='viridis',ax=ax)# dados faltantes:concentracao nas colunas

housing['median_house_value'].hist()#classes desbalanceadas?????? SIMMMMMMMMMMMMMMMMMMMMMM


sns.boxplot(x='median_house_value',y='total_bedrooms',data =housing )


# Criando variáveis do tipo dummies!

housing.columns


housing.iloc[:,housing.columns.isin(('ocean_proximity','ocean_proximity')) ]##ocean_proximity : é uma variável categórica

pd.get_dummies(housing['ocean_proximity']) #Dummy


# # Escalonamento de variáveis 
# (importante para alg que calculam distâncias como a euclidiana (KNN...)


import sklearn

from sklearn.preprocessing import StandardScaler, MinMaxScaler

scaler = StandardScaler()

type(housing['ocean_proximity'])

scaler.fit_transform(housing[['median_income']])



# # Normalizando

min_max_scaler = MinMaxScaler()

min_max_scaler.fit_transform(housing[['population']]) #normalize the columns of this dataframe where each value is between 0 and 1


# # Balanceamento (Resampling) e escalonamento do datset:

##Fazer balancemento no treinamento para equilibrar a qtd de amostras de casa de cada categoria de preco

housing[housing['median_house_value']>=100000].count()


housing[housing['median_house_value']>=500000].count()

housing['median_house_value'].hist()#classes desbalanceadas!

# # Abordagem escolhida: Down-sample Majority Class

from sklearn.utils import resample


# Separate majority and minority classes

df_majority_down = housing[housing.median_house_value<=300000]
df_minority_down = housing[housing.median_house_value>=400000]
1 resposta
solução!

Oii Edson, tudo certinho por ai?

Desculpa a demora em te dar um retorno.

No seu caso, esse desbalanceamento de valores não e é algo atípico, como estamos considerando preços de casas, é bem normal elas terem um comportamento como esse, já que algumas casas que valem mais e outras valem menos, isso na vida real é comum e varia por n motivos, como localização, número de quartos, número de banheiros, número de vagas para o carro, entre outros.

Nós precisamos usar o resampling quando encontramos uma situação de classe desbalanceada, por exemplo, quando temos 90% dos dados classificados como X e 10% classificados com Y. Com isso podemos gerar resultados indesejados como, tal como, o modelo apenas classificar os dados para a classe mais presente nos dados. Para o resampling, nós temos duas opções, e essas são: classificação e regressão, vou te explicar um pouco sobre as elas.

Classificação: é usada quando temos bases com a variável resposta desbalanceada, mas só usamos no conjunto de treino. Dentro desse caso temos as opções de Oversampling e Undersampling.

  • Oversampling: Para utilizar o Oversampling podemos simplesmente duplicar alguma das nossas amostras de maneira aleatória, assim como no undersampling também temos maneiras mais elaboradas de gerar esses dados como, por exemplo, gerar dados sintéticos, é o caso da técnica SMOTE (Synthetic Minority Oversampling Technique), você pode ver o artigo que originou esse método e entender ele melhor aqui (em inglês).
  • Undersampling: Para utilizar o undersampling podemos simplesmente selecionar e remover, de maneira aleatória, parte da nossa amostra que é mais representada. Existem maneiras mais elaboradas para aplicar essa técnica como, por exemplo, o Cluster. Um problema em aplicar essa técnica é que vamos perder muitos dados, então só conseguimos aplicar ela quando temos muitos dados e mesmo assim vamos estar perdendo informação, algo que pode ser negativo.

Regressão: Já na regressão, nós usamos o Bootstrapping, e neste método faz a seleção de amostras aleatórias dos dados para a avaliação do modelo. Ele pode ser usado para estimar estatísticas resumidas, como a média ou o desvio padrão. Ele é usado no aprendizado de máquina aplicado para estimar a habilidade dos modelos de aprendizado de máquina ao fazer previsões sobre dados não incluídos no treinamento.

Depois de vermos sobre o que é cada tipo de resampling, acredito que no seu caso é necessário manter esses valores com essas variações, já que são valores reais e retirar essas variações pode fazer com que seus resultados sejam errôneos. Caso você ainda tenha dúvidas, pode me perguntar sobre!

Bons estudos ^^

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software