[PYTHON] Vorhersage der Immobilienpreise (Datenvorverarbeitung: erstes Halbjahr) ver1.1

Einführung

Wir werden das als Tutorial in Kaggle verwendete Problem der Vorhersage des Verkaufspreises (Hauspreis) lösen. Beim letzten Mal haben wir eine einfache Vorhersage durch lineare Regression getroffen. Dieses Mal führen wir jedoch eine Datenvorverarbeitung durch, z. B. das Speichern fehlender Werte, das Konvertieren kategorialer Variablen und das Festlegen neuer Funktionen. Wir werden in der zweiten Hälfte maschinelles Lernen und Vorhersagen durchführen.

Letzte Hälfte https://qiita.com/Fumio-eisan/items/7e13695ef5ccc6acf61c

Ich habe dies als Referenz verwendet. https://www.kaggle.com/serigne/stacked-regressions-top-4-on-leaderboard

Datenvorverarbeitung

Laden Sie zunächst train, test.csv-Daten von der folgenden URL in einen beliebigen Ordner herunter. https://www.kaggle.com/c/house-prices-advanced-regression-techniques

Laden der erforderlichen Bibliotheken


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

Daten gelesen


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

Lesen Sie diesmal zuerst die Zug- und Testdaten.

ID-Spalte löschen



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

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

Die ID-Spalte ist nicht erforderlich. Löschen Sie sie daher und definieren Sie sie als separate Variable.

Ausreißer löschen


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

Mit Blick auf GrLivArea und SalePrice gibt es zwei Ausreißerdiagramme, in denen GrLivArea 4000 oder höher und SalePrice weniger als 300 beträgt. Dies ist ein Faktor, der die Vorhersage erschwert. Löschen Sie ihn daher.

#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

Ich konnte es löschen. Ich denke jedoch nicht, dass dieses Löschen einfach sein sollte. Ich halte es für wünschenswert, die Bedeutung der Ausreißer als Daten zu betrachten.

Datenstandardisierung

Als nächstes protokollieren Sie den SalePrice und verarbeiten ihn so, dass er auf einer Normalverteilung läuft. Ich kann den detaillierten Grund dafür nicht wirklich erklären, deshalb möchte ich ihn separat zusammenfassen.

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()

** Vorher ändern ** 009.png

** Nach der veränderung ** 010.png

Ich konnte es zu einer Normalverteilung machen, indem ich den Logarithmus nahm.

Implementierung von Feature Engineering

Wir werden fehlende Werte behandeln, neue Features ermitteln und Dummy-Variablen für kategoriale Variablen erstellen. Passen Sie zunächst die Zugdaten und Testdaten an.


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))

Handhabung fehlender Werte

Als nächstes werden wir die fehlenden Werte verarbeiten.


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")

Dummy-Variable der Kategorievariablen

Machen Sie als Nächstes die kategoriale Variable zu einer Dummy-Variablen. ** Stellen Sie dabei sicher, dass die Trainings- und Testdaten zuerst übereinstimmen. Und lassen Sie uns die übereinstimmenden Daten verarbeiten. Wenn Sie die Dummy-Variablenverarbeitung als separate Daten ausführen, stimmt die Anzahl der Spalten möglicherweise nicht überein, und Sie können am Ende keine Vorhersage treffen. ** ** **

Ich habe sie separat behandelt und später stimmte manchmal die Anzahl der Spalten nicht überein. Ich habe versucht, die Anzahl der Spalten gleich zu erzwingen, aber ich habe versucht, diejenigen auszugeben, die mit den Dummy-Variablen nicht ausreichten, und diejenigen, die viele für csv waren, aber ich habe aufgegeben. .. Lassen Sie uns von Anfang an übereinstimmen. ..


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

Zusammenfassung

Das ist alles für diese Zeit. In der zweiten Hälfte werden wir tatsächlich analysieren und versuchen, die Genauigkeit des Modells zu verbessern.

Letzte Hälfte https://qiita.com/Fumio-eisan/items/7e13695ef5ccc6acf61c

Das vollständige Programm finden Sie hier. https://github.com/Fumio-eisan/houseprice20200301

Recommended Posts

Vorhersage der Immobilienpreise (Datenvorverarbeitung: erstes Halbjahr) ver1.1
Vorhersage der Immobilienpreise (maschinelles Lernen: zweite Hälfte) ver1.1
Vorhersage der Immobilienpreise (Rendite durch lineare Regression (kaggle)) ver1.0