Sklearn-Hauspreisvorhersage
Als Nächstes verwenden wir sklearn, um die Immobilienpreise in Peking vorherzusagen.
Wir werden Schritt für Schritt vom Laden der Daten, der explorativen Analyse und dem Feature-Engineering bis zum Modelltraining und der Optimierung vorgehen und zeigen, wie man die Tools und Bibliotheken von sklearn verwendet, um die Vorhersageaufgabe abzuschließen.
Überblick:
1. Datengenerierung und Überprüfung
- Ein Dictionary wird verwendet, um simulierte Daten zu erstellen, und dann wird es umgewandelt in
pandas DataFrame。 - Die Daten enthalten die Wohnfläche, die Anzahl der Zimmer, die Etage, das Baujahr, den Standort (kategoriale Variable) und den Hauspreis (Zielvariable).
- Durch
df.head()unddf.describe()um die grundlegende Struktur und die statistischen Informationen der Daten zu überprüfen.
2. Datenvorverarbeitung
- Feature-Auswahl: Merkmale, die mit dem Hauspreis zusammenhängen (Fläche, Anzahl der Zimmer, Etage, Baujahr, Lage), werden aus den Originaldaten ausgewählt.
- Datenaufteilung: Verwenden Sie
train_test_splitum den Datensatz in 80% Trainingsset und 20% Testset aufzuteilen. - Standardisierung numerischer Merkmale: Verwenden Sie
StandardScalerum numerische Merkmale zu standardisieren. - Kodierung kategorischer Merkmale: Verwenden Sie
OneHotEncoderfür kategorische Merkmale (location) One-Hot-Encoding durchführen. ColumnTransformerIntegrieren Sie die Verarbeitung numerischer und kategorischer Merkmale in einen Schritt.
3. Modelltraining
- Verwenden Sie
Pipelineum die Datenvorverarbeitung mit den Modelltrainingsschritten zu kombinieren und sicherzustellen, dass der gesamte Prozess als Pipeline ausgeführt wird. - Verwenden Sie das lineare Regressionsmodell (
LinearRegression) zum Training.
4. Modellbewertung
- Durch
mean_squared_errorBerechnung des mittleren quadratischen Fehlers (MSE) und durchr2_scoreBerechnung des Bestimmtheitsmaßes (R²). - Geben Sie die Evaluierungsergebnisse aus, um die Vorhersagegenauigkeit des Modells zu überprüfen.
5. Modelloptimierung
- Verwenden Sie
GridSearchCVum die Hyperparameter der linearen Regression abzustimmen. Die wichtigste Anpassung istfit_intercept(ob der Achsenabschnitt angepasst werden soll). - Finden Sie die besten Hyperparameter durch Grid Search und verwenden Sie das beste Modell, um auf dem Testset Vorhersagen zu treffen.
- Berechnen Sie die Evaluierungsmetriken (MSE und R²) des optimierten Modells neu.
1. Datengenerierung und Überprüfung
Wir konstruieren zunächst einen simulierten DataFrame, der einige gängige Merkmale zur Vorhersage von Hauspreisen enthält, wie Wohnfläche, Anzahl der Zimmer, Etage, Baujahr und geografische Lage (kategorische Variable).
Beispiel
import numpy as np
# Simulierte Daten: Wohnfläche (Quadratmeter), Anzahl der Zimmer, Etage, Baujahr, Lage (kategorische Variable)
data = {
'area': [70, 85, 100, 120, 60, 150, 200, 80, 95, 110],
'rooms': [2, 3, 3, 4, 2, 5, 6, 3, 3, 4],
'floor': [5, 2, 8, 10, 3, 15, 18, 7, 9, 11],
'year_built': [2005, 2010, 2012, 2015, 2000, 2018, 2020, 2008, 2011, 2016],
'location': ['Chaoyang', 'Haidian', 'Chaoyang', 'Dongcheng', 'Fengtai', 'Haidian', 'Chaoyang', 'Fengtai', 'Dongcheng', 'Haidian'],
'price': [5000000, 6000000, 6500000, 7000000, 4500000, 10000000, 12000000, 5500000, 6200000, 7500000] # Hauspreis (Zielvariable)
}
# DataFrame erstellen
df = pd.DataFrame(data)
# Daten anzeigen
print("Datenvorschau:")
print(df.head())
Ausgabe:
数据预览: area rooms floor year_built location price 0 70 2 5 2005 Chaoyang 5000000 1 85 3 2 2010 Haidian 6000000 2 100 3 8 2012 Chaoyang 6500000 3 120 4 10 2015 Dongcheng 7000000 4 60 2 3 2000 Fengtai 4500000
2. Datenvorverarbeitung
Datenvorverarbeitung umfasst normalerweise Merkmalsauswahl, Merkmalstransformation, den Umgang mit fehlenden Werten, Datenstandardisierung und so weiter. Wir werden numerische Merkmale standardisieren und kategoriale Merkmale one-hot-codieren.
Beispiel
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
# Merkmalsauswahl
X = df[['area', 'rooms', 'floor', 'year_built', 'location']] # Merkmale
y = df['price'] # Zielvariable
# Trainings- und Testsatz aufteilen
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Vorverarbeitungsschritte erstellen
numeric_features = ['area', 'rooms', 'floor', 'year_built']
categorical_features = ['location']
numeric_transformer = Pipeline(steps=[
('scaler', StandardScaler()) # Numerische Merkmale standardisieren
])
categorical_transformer = Pipeline(steps=[
('onehot', OneHotEncoder(handle_unknown='ignore')) # Neue Kategorien im Testsatz behandeln
])
# Zu ColumnTransformer zusammenfassen
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
]
)
# Struktur nach der Datenvorverarbeitung anzeigen
X_train_transformed = preprocessor.fit_transform(X_train)
print("Vorverarbeitete Trainingsdaten:")
print(X_train_transformed)
Das Ausgabeergebnis ist:
tianqixin@Mac-mini example-test % python3 test.py 预处理后的训练数据: [[ 0.89826776 1.0440738 1.14636101 0.96800387 0. 0. 0. 1. ] [-0.95622052 -1.23390539 -0.98640366 -1.04544418 1. 0. 0. 0. ] [-0.72440948 -0.474579 -0.55985073 -0.58080232 0. 0. 1. 0. ] [-0.26078741 -0.474579 -0.34657426 0.03872015 1. 0. 0. 0. ] [-0.02897638 0.2847474 0.29325514 0.65824263 0. 0. 0. 1. ] [-1.18803155 -1.23390539 -1.4129566 -1.81984727 0. 0. 1. 0. ] [ 0.20283466 0.2847474 0.07997868 0.50336201 0. 1. 0. 0. ] [ 2.05732294 1.80340019 1.78619041 1.2777651 1. 0. 0. 0. ]]
3. Modellaufbau
Als Nächstes verwenden wir ein lineares Regressionsmodell, um Hauspreise vorherzusagen. Wir verwenden eine Pipeline, um die Vorverarbeitung und die Modelltrainingsschritte zu integrieren.
Beispiel
# Eine Pipeline erstellen, die Vorverarbeitung und ein Regressionsmodell enthält
model_pipeline = Pipeline(steps=[
('preprocessor', preprocessor), # Schritte der Datenvorverarbeitung
('regressor', LinearRegression()) # Regressionsmodell
])
# Modell trainieren
model_pipeline.fit(X_train, y_train)
# Vorhersagen erstellen
y_pred = model_pipeline.predict(X_test)
# Vorhersageergebnisse ausgeben
print("\nVorhersageergebnisse:")
print(y_pred)
Das Ausgabeergebnis ist:
预测结果: [6375000.00000001 4874999.99999998]
4. Modellbewertung
Bei der Modellbewertung verwenden wir üblicherweise den mittleren quadratischen Fehler (MSE) und das Bestimmtheitsmaß (R²), um die Leistung eines Regressionsmodells zu bewerten.
Beispiel
# Mittleren quadratischen Fehler (MSE) und Bestimmtheitsmaß (R²) berechnen
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
# Auswertungsergebnisse ausgeben
print("\nModellbewertung:")
print(f"Mittlerer quadratischer Fehler (MSE): {mse:.2f}")
print(f"Bestimmtheitsmaß (R²): {r2:.2f}")
Das Ausgabeergebnis ist:
预测结果: [6375000.00000001 4874999.99999998] tianqixin@Mac-mini example-test % python3 test.py 模型评估: 均方误差 (MSE): 648125000000.03 决定系数 (R²): -63.81
5. Modelloptimierung (Grid Search)
Um die Leistung des Modells zu verbessern, können wir GridSearchCV verwenden, um die Hyperparameter des Modells abzustimmen. In diesem Beispiel passen wir die Parameter der linearen Regression nicht an, da es nicht viele Hyperparameter zum Optimieren gibt. Für komplexere Modelle (z. B. Random Forest, XGBoost usw.) können wir die besten Parameter durch Grid Search finden.
Beispiel
# 5. Modelloptimierung: Hyperparameter mit Grid Search optimieren
# Hyperparameter der linearen Regression optimieren (nur 'fit_intercept' anpassen)
param_grid = {
'regressor__fit_intercept': [True, False], # Ob der Achsenabschnitt angepasst werden soll
}
grid_search = GridSearchCV(model_pipeline, param_grid, cv=5, scoring='neg_mean_squared_error', verbose=1)
grid_search.fit(X_train, y_train)
# Beste Parameter und Ergebnisse ausgeben
print("\nBeste Parameter:")
print(grid_search.best_params_)
# Das beste Modell verwenden, um Vorhersagen zu treffen
best_model = grid_search.best_estimator_
y_pred_optimized = best_model.predict(X_test)
# Optimierte Bewertungsergebnisse ausgeben
mse_opt = mean_squared_error(y_test, y_pred_optimized)
r2_opt = r2_score(y_test, y_pred_optimized)
print("\nBewertung des optimierten Modells:")
print(f"Mittlerer quadratischer Fehler (MSE): {mse_opt:.2f}")
print(f"Bestimmtheitsmaß (R²): {r2_opt:.2f}")
Das Ausgabeergebnis ist:
Fitting 5 folds for each of 2 candidates, totalling 10 fits
最佳参数:
{'regressor__fit_intercept': True}
优化后的模型评估:
均方误差 (MSE): 648125000000.03
决定系数 (R²): -63.81
Vollständiger Code
Vollständiger Code für die Vorhersage von Hauspreisen in Peking:
Beispiel
import numpy as np
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# Simulierte Daten: enthält Wohnfläche, Anzahl der Zimmer, Etage, Baujahr, Lage (kategorische Variable) und Hauspreis (Zielvariable)
data = {
'area': [70, 85, 100, 120, 60, 150, 200, 80, 95, 110],
'rooms': [2, 3, 3, 4, 2, 5, 6, 3, 3, 4],
'floor': [5, 2, 8, 10, 3, 15, 18, 7, 9, 11],
'year_built': [2005, 2010, 2012, 2015, 2000, 2018, 2020, 2008, 2011, 2016],
'location': ['Chaoyang', 'Haidian', 'Chaoyang', 'Dongcheng', 'Fengtai', 'Haidian', 'Chaoyang', 'Fengtai', 'Dongcheng', 'Haidian'],
'price': [5000000, 6000000, 6500000, 7000000, 4500000, 10000000, 12000000, 5500000, 6200000, 7500000] # Hauspreis (Zielvariable)
}
# DataFrame erstellen
df = pd.DataFrame(data)
# Daten anzeigen
print("Datenvorschau:")
print(df.head())
# Merkmalsauswahl
X = df[['area', 'rooms', 'floor', 'year_built', 'location']] # Merkmalsdaten
y = df['price'] # Zielvariable
# Trainings- und Testsatz aufteilen
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Datenvorverarbeitung: numerische Merkmale standardisieren, kategorische Merkmale One-Hot-kodieren
numeric_features = ['area', 'rooms', 'floor', 'year_built']
categorical_features = ['location']
# Vorverarbeitung numerischer Merkmale: Standardisierung
numeric_transformer = Pipeline(steps=[
('scaler', StandardScaler())
])
# Vorverarbeitung kategorischer Merkmale: One-Hot-Encoding, handle_unknown='ignore' setzen
categorical_transformer = Pipeline(steps=[
('onehot', OneHotEncoder(handle_unknown='ignore')) # Neue Kategorien im Testsatz behandeln
])
# Verarbeitungsschritte für numerische und kategorische Merkmale zusammenführen
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
]
)
# 3. Modell erstellen
# Verwenden Sie ein lineares Regressionsmodell in Kombination mit Schritten zur Datenvorverarbeitung
model_pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('regressor', LinearRegression())
])
# Modell trainieren
model_pipeline.fit(X_train, y_train)
# Vorhersagen erstellen
y_pred = model_pipeline.predict(X_test)
# Vorhersageergebnisse ausgeben
print("\nVorhersageergebnisse:")
print(y_pred)
# 4. Modellbewertung: mittleren quadratischen Fehler (MSE) und Bestimmtheitsmaß R² berechnen
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("\nModellbewertung:")
print(f"Mittlerer quadratischer Fehler (MSE): {mse:.2f}")
print(f"Bestimmtheitsmaß (R²): {r2:.2f}")
# 5. Modelloptimierung: Hyperparameter mit Grid Search optimieren
# Hyperparameter der linearen Regression optimieren (nur 'fit_intercept' anpassen)
param_grid = {
'regressor__fit_intercept': [True, False], # Ob der Achsenabschnitt angepasst werden soll
}
grid_search = GridSearchCV(model_pipeline, param_grid, cv=5, scoring='neg_mean_squared_error', verbose=1)
grid_search.fit(X_train, y_train)
# Beste Parameter und Ergebnisse ausgeben
print("\nBeste Parameter:")
print(grid_search.best_params_)
# Das beste Modell verwenden, um Vorhersagen zu treffen
best_model = grid_search.best_estimator_
y_pred_optimized = best_model.predict(X_test)
# Optimierte Bewertungsergebnisse ausgeben
mse_opt = mean_squared_error(y_test, y_pred_optimized)
r2_opt = r2_score(y_test, y_pred_optimized)
print("\nBewertung des optimierten Modells:")
print(f"Mittlerer quadratischer Fehler (MSE): {mse_opt:.2f}")
print(f"Bestimmtheitsmaß (R²): {r2_opt:.2f}")
Nach dem Ausführen dieses Codes lautet die Ausgabe:
数据预览:
area rooms floor year_built location price
0 70 2 5 2005 Chaoyang 5000000
1 85 3 2 2010 Haidian 6000000
2 100 3 8 2012 Chaoyang 6500000
3 120 4 10 2015 Dongcheng 7000000
4 60 2 3 2000 Fengtai 4500000
预测结果:
[6375000.00000001 4874999.99999998]
模型评估:
均方误差 (MSE): 648125000000.03
决定系数 (R²): -63.81
Fitting 5 folds for each of 2 candidates, totalling 10 fits
最佳参数:
{'regressor__fit_intercept': True}
优化后的模型评估:
均方误差 (MSE): 648125000000.03
决定系数 (R²): -63.81
Andere Erweiterungen