[PYTHON] Prédiction des prix des logements (prétraitement des données: premier semestre) ver1.1

introduction

Nous allons résoudre le problème de prédiction du prix de vente (prix de l'immobilier) utilisé comme tutoriel dans Kaggle. La dernière fois, nous avons fait une simple prédiction par régression du premier ordre, mais cette fois, nous effectuerons un prétraitement des données tel que la sauvegarde des valeurs manquantes, la conversion de variables catégorielles et la spécification de nouvelles quantités de caractéristiques. Nous ferons de l'apprentissage automatique et de la prédiction au second semestre.

Seconde moitié https://qiita.com/Fumio-eisan/items/7e13695ef5ccc6acf61c

Je l'ai utilisé comme référence. https://www.kaggle.com/serigne/stacked-regressions-top-4-on-leaderboard

Prétraitement des données

Tout d'abord, téléchargez les données train, test.csv à partir de l'URL suivante vers n'importe quel dossier. https://www.kaggle.com/c/house-prices-advanced-regression-techniques

Chargement des bibliothèques requises


import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
%matplotlib inline
import matplotlib.pyplot as plt  # Matlab-style plotting
import seaborn as sns
color = sns.color_palette()
sns.set_style('darkgrid')
import warnings
def ignore_warn(*args, **kwargs):
    pass
warnings.warn = ignore_warn #ignore annoying warning (from sklearn and seaborn)


from scipy import stats
from scipy.stats import norm, skew #for some statistics


pd.set_option('display.float_format', lambda x: '{:.3f}'.format(x)) #Limiting floats output to 3 decimal points

Lecture des données


train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

Cette fois, lisez d'abord les données de train et de test.

Supprimer la colonne Id



train_ID = train['Id']
test_ID = test['Id']

train.drop("Id", axis = 1, inplace = True)
test.drop("Id", axis = 1, inplace = True)

La colonne Id n'est pas nécessaire, supprimez-la et définissez-la comme une variable distincte.

Supprimer les valeurs aberrantes


fig, ax = plt.subplots()
ax.scatter(x = train['GrLivArea'], y = train['SalePrice'])
plt.ylabel('SalePrice', fontsize=13)
plt.xlabel('GrLivArea', fontsize=13)
plt.show()

007.png

En regardant le GrLivArea et le SalePrice, il existe deux parcelles aberrantes où le GrLivArea est de 4000 ou plus et le SalePrice est inférieur à 300000. C'est un facteur qui le rend difficile à prévoir, alors supprimez-le.

#Deleting outliers
train = train.drop(train[(train['GrLivArea']>4000) & (train['SalePrice']<300000)].index)

#Check the graphic again
fig, ax = plt.subplots()
ax.scatter(train['GrLivArea'], train['SalePrice'])
plt.ylabel('SalePrice', fontsize=13)
plt.xlabel('GrLivArea', fontsize=13)
plt.show()

008.png

J'ai pu le supprimer. Cependant, je ne pense pas que cette suppression devrait être effectuée facilement. Je pense qu'il est souhaitable de considérer la signification des valeurs aberrantes comme des données.

Standardisation des données

Ensuite, enregistrez le SalePrice et traitez-le pour qu'il repose sur une distribution normale. Je ne peux pas en expliquer la raison détaillée à ma manière, je voudrais donc la résumer séparément.

https://qiita.com/ttskng/items/2a33c1ca925e4501e609 https://ishitonton.hatenablog.com/entry/2019/02/24/184253

#We use the numpy fuction log1p which  applies log(1+x) to all elements of the column
train["SalePrice"] = np.log1p(train["SalePrice"])

#Check the new distribution 
sns.distplot(train['SalePrice'] , fit=norm);

# Get the fitted parameters used by the function
(mu, sigma) = norm.fit(train['SalePrice'])
print( '\n mu = {:.2f} and sigma = {:.2f}\n'.format(mu, sigma))

#Now plot the distribution
plt.legend(['Normal dist. ($\mu=$ {:.2f} and $\sigma=$ {:.2f} )'.format(mu, sigma)],
            loc='best')
plt.ylabel('Frequency')
plt.title('SalePrice distribution')

#Get also the QQ-plot
fig = plt.figure()
res = stats.probplot(train['SalePrice'], plot=plt)
plt.show()

** Changer avant ** 009.png

** Après changement ** 010.png

J'ai pu en faire une distribution normale en prenant le logarithmique.

Mise en œuvre de l'ingénierie des fonctionnalités

Nous traiterons les valeurs manquantes, déterminerons de nouvelles fonctionnalités et créerons des variables factices pour les variables catégorielles. Tout d'abord, faites correspondre les données du train et les données de test.


ntrain = train.shape[0]
ntest = test.shape[0]
y_train = train.SalePrice.values
all_data = pd.concat((train, test)).reset_index(drop=True)
all_data.drop(['SalePrice'], axis=1, inplace=True)
print("all_data size is : {}".format(all_data.shape))

Gestion des valeurs manquantes

Ensuite, nous traiterons les valeurs manquantes.


all_data["PoolQC"] = all_data["PoolQC"].fillna("None")
all_data["MiscFeature"] = all_data["MiscFeature"].fillna("None")
all_data["Alley"] = all_data["Alley"].fillna("None")
all_data["Fence"] = all_data["Fence"].fillna("None")
all_data["FireplaceQu"] = all_data["FireplaceQu"].fillna("None")
all_data["LotFrontage"] = all_data.groupby("Neighborhood")["LotFrontage"].transform(
    lambda x: x.fillna(x.median()))
for col in ('GarageType', 'GarageFinish', 'GarageQual', 'GarageCond'):
    all_data[col] = all_data[col].fillna('None')

for col in ('BsmtFinSF1', 'BsmtFinSF2', 'BsmtUnfSF','TotalBsmtSF', 'BsmtFullBath', 'BsmtHalfBath'):
    all_data[col] = all_data[col].fillna(0)
for col in ('BsmtQual', 'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinType2'):
    all_data[col] = all_data[col].fillna('None')
all_data["MasVnrType"] = all_data["MasVnrType"].fillna("None")
all_data["MasVnrArea"] = all_data["MasVnrArea"].fillna(0)
all_data['MSZoning'] = all_data['MSZoning'].fillna(all_data['MSZoning'].mode()[0])
all_data = all_data.drop(['Utilities'], axis=1)
all_data["Functional"] = all_data["Functional"].fillna("Typ")
all_data['Electrical'] = all_data['Electrical'].fillna(all_data['Electrical'].mode()[0])
all_data['KitchenQual'] = all_data['KitchenQual'].fillna(all_data['KitchenQual'].mode()[0])
all_data['Exterior1st'] = all_data['Exterior1st'].fillna(all_data['Exterior1st'].mode()[0])
all_data['Exterior2nd'] = all_data['Exterior2nd'].fillna(all_data['Exterior2nd'].mode()[0])
all_data['SaleType'] = all_data['SaleType'].fillna(all_data['SaleType'].mode()[0])
all_data['MSSubClass'] = all_data['MSSubClass'].fillna("None")

Variable fictive de la variable de catégorie

Ensuite, faites de la variable catégorielle une variable factice. ** En guise de mise en garde, assurez-vous que les données d'entraînement et de test correspondent d'abord. Et traitons les données correspondantes. Si vous effectuez un traitement de variable fictive en tant que données distinctes, le nombre de colonnes peut ne pas correspondre et vous ne pourrez pas prévoir à la fin. ** **

Je les ai traités séparément et plus tard, parfois, le nombre de colonnes ne correspond pas. J'ai essayé de forcer l'alignement du nombre de colonnes, mais j'ai essayé de sortir celles qui n'étaient pas suffisantes avec les variables factices et celles qui étaient nombreuses à csv, mais j'ai abandonné. .. Faisons correspondre depuis le début. ..


all_data = pd.get_dummies(all_data)
print(all_data.shape)

Résumé

C'est tout pour cette fois. Dans la seconde moitié, nous analyserons et viserons à améliorer la précision du modèle.

Seconde moitié https://qiita.com/Fumio-eisan/items/7e13695ef5ccc6acf61c

Le programme complet est ici. https://github.com/Fumio-eisan/houseprice20200301

Recommended Posts

Prédiction des prix des logements (prétraitement des données: premier semestre) ver1.1
Prédire les prix des logements (apprentissage automatique: deuxième semestre) ver1.1
Prédiction des prix des logements (retour par régression linéaire (kaggle)) ver1.0