Pour déterminer le loyer approprié pour un studio dans une certaine zone Construisons un modèle en Python capable de prédire le loyer avec une grande précision à partir d'autres variables.
41 ensembles de données (souba.csv) sur les studios dans une certaine zone
id: ID de la propriété loyer: Loyer (yen) surface: surface (m2m2) âge: Âge (années) minutes: Station à pied (minutes)
Tout d'abord, importez et confirmez les données.
import numpy as np
import pandas as pd
import seaborn as sns
df = pd.read_csv("souba.csv")
df.head()
id rent area age minutes
0 1 4.3 13.00 26 6
1 2 4.2 14.35 35 5
2 3 5.0 15.60 33 9
3 4 4.5 13.09 32 5
4 5 4.6 12.92 38 7
Suppression des ID de variable sans signification qui ne sont pas pertinents pour l'analyse.
data = df.drop(["id"], axis = 1)
data.head()
rent area age minutes
0 4.3 13.00 26 6
1 4.2 14.35 35 5
2 5.0 15.60 33 9
3 4.5 13.09 32 5
4 4.6 12.92 38 7
Divisez en données d'entraînement et en données de test à 7: 3.
#Divisé en données d'entraînement et données de test
X = data[["area", "age", "minutes"]].values
y = data["rent"].values
from sklearn.model_selection import train_test_split, cross_validate, KFold
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3)
X_train.shape, X_test.shape
((28, 3), (13, 3))
Créez un Dataframe pour chacune des données d'entraînement et des données de test.
#Créer un Dataframe
data_train = pd.DataFrame(X_train,columns = ["area", "age", "minutes"])
data_train["rent"] = y_train
data_test = pd.DataFrame(X_test,columns = ["area", "age", "minutes"])
data_test["rent"] = y_test
Tout d'abord, visualisons les données d'entraînement. Le but de la visualisation est ① Saisir grossièrement la relation de l'ensemble des données ② Découvrez les valeurs aberrantes
sns.pairplot(data_train)
En regardant la relation entre le loyer et d'autres variables, ・ La zone semble être corrélée ・ Les minutes (à pied de la gare) ne sont pas aussi fortes que la zone, mais il semble y avoir une faible corrélation ・ L'âge (âge) semble être proche de la corrélation inverse On peut le lire.
Il n'y a qu'une seule valeur aberrante dans la zone, alors excluez-la.
#Correspondance des valeurs aberrantes
data_train = data_train.query("area < 40")
sns.pairplot(data_train)
Ensuite, calculons le coefficient de corrélation.
data_train.corr()
area age minutes rent
area 1.000000 -0.148793 0.207465 0.925012
age -0.148793 1.000000 -0.088959 -0.315480
minutes 0.207465 -0.088959 1.000000 0.154623
rent 0.925012 -0.315480 0.154623 1.000000
En regardant la corrélation entre le loyer et chaque variable, La zone a une corrélation très élevée, mais l'âge a une faible corrélation inverse, et les minutes n'ont pratiquement aucune corrélation.
De ce qui précède. Il semble bon de le prendre comme un montant de fonction dans l'ordre zone> âge> minutes.
【point】 ・ Assurez-vous de sélectionner un modèle en utilisant uniquement les données d'entraînement.
Tout d'abord, créons un modèle de régression linéaire lorsque les variables explicatives sont toutes des variables. Ici, nous utilisons la validation croisée en trois volets.
X_train = data_train[["area", "age","minutes"]].values
y_train = data_train["rent"].values
LR = LinearRegression()
res_1 = cross_validate(LR, X = X_train, y = y_train, scoring = "r2", cv = KFold(n_splits = 3, shuffle = True), return_train_score = True)
res_1
#But
{'fit_time': array([0. , 0.00254989, 0.00099754]),
'score_time': array([0.00401378, 0. , 0. ]),
'test_score': array([-0.11587073, 0.67717773, 0.65301948]),
'train_score': array([0.96132849, 0.66332986, 0.90608152])}
Ensuite, créons un modèle de régression linéaire en excluant la marche de la station des variables explicatives.
X_train = data_train[["area", "age"]].values
y_train = data_train["rent"].values
LR = LinearRegression()
res_2 = cross_validate(LR, X = X_train, y = y_train, scoring = "r2", cv = KFold(n_splits = 3, shuffle = True), return_train_score = True)
res_2
#But
{'fit_time': array([0.00318336, 0.0009973 , 0.0010891 ]),
'score_time': array([0. , 0.00185704, 0. ]),
'test_score': array([0.32138226, 0.87606109, 0.83912145]),
'train_score': array([0.94496232, 0.88506422, 0.80168397])}
En comparant chaque test_score, Puisque ce dernier modèle, qui exclut la marche en station des variables explicatives, a un coefficient de détermination plus élevé, nous l'adopterons comme modèle.
Apprenez le modèle avec les caractéristiques comme la superficie et l'âge.
X_train = data_train[["area", "age"]].values
y_train = data_train["rent"].values
LR = LinearRegression()
LR.fit(X_train, y_train)
Placez les données de test dans le modèle créé et vérifiez l'exactitude.
X_test = data_test[["area", "age"]].values
y_test = data_test["rent"].values
y_pred = LR.predict(X_test)
r2_score(y_true = y_test, y_pred = y_pred)
#Évaluation du modèle
0.8623439786705054
En conséquence, le coefficient de décision dans les données de test était de 0,8 ou plus. Cela semble être un modèle avec un certain degré de précision.
Recommended Posts