Maschinelles Lernen - Hauspreisvorhersage
Beim Hauskauf treffen Menschen in der Regel eine umfassende Beurteilung: Lage, Fläche, Alter der Immobilie, Anzahl der Zimmer, Bevölkerungsdichte, Verkehrsanbindung usw. Jeder Faktor beeinflusst den Preis, aber dieser Einfluss ist nicht linear oder eindimensional; vielmehr ist er das Ergebnis von Akkumulation, Abwägungen und Konkurrenz zwischen den Faktoren.
Beim maschinellen Lernen verwandelnRegressionsproblemeim Wesentlichen diese „erfahrungsbasierte Beurteilung“ in ein berechenbares, wiederverwendbares und bewertbares mathematisches Modell.
Dieses Kapitel beginnt von Grund auf und führt durch die vollständige Standard-Machine-Learning-Pipeline zurHauspreisvorhersage: Datenverständnis → Merkmalsanalyse → Modelltraining → Modellbewertung → Modelloptimierung. Das Ziel ist nicht, APIs auswendig zu lernen, sondern zu verstehen, was jeder Schritt tut und warum er gemacht wird.
Teil 1: Projektvorbereitung und Einrichtung der Umgebung
1.1 Verwendete Kernwerkzeuge
- NumPy: Ein Werkzeug für numerische Berechnungen auf niedriger Ebene, das effiziente Array-Operationen bietet.
- Pandas: Ein Kerntool für die Analyse tabellarischer Daten, unverzichtbar in den frühen Phasen des maschinellen Lernens.
- Matplotlib / Seaborn: Datenvisualisierung, verwendet, um Datenverteilungen und -beziehungen zu verstehen.
- Scikit-learn: Eine Machine-Learning-Toolbox, die Datensätze, Modelle und Bewertungsmethoden abdeckt.
1.2 Abhängigkeiten installieren
pip install numpy pandas matplotlib seaborn scikit-learn
Teil 2: Laden und Verstehen des Datensatzes
Frühe Tutorials verwendeten oft den Datensatz Boston Housing, aber er wurde als veraltet eingestuft. Hier verwenden wir den offiziell empfohlenen DatensatzCalifornia Housing, der dasselbe Konzept hat, aber standardisiertere Daten.
Beispiel: Daten laden
from sklearn.datasets import fetch_california_housing
# Lade den Datensatz zu kalifornischen Immobilienpreisen
data = fetch_california_housing()
# Merkmalsdaten (X)
df_features = pd.DataFrame(
data.data,
columns=data.feature_names
)
# Zielvariable (y): Median des Hauswerts
df_target = pd.DataFrame(
data.target,
columns=['MedHouseVal']
)
print(df_features.head())
print(df_target.head())
Ausgabe:
MedInc HouseAge AveRooms AveBedrms Population AveOccup Latitude Longitude 0 8.3252 41.0 6.984127 1.023810 322.0 2.555556 37.88 -122.23 1 8.3014 21.0 6.238137 0.971880 2401.0 2.109842 37.86 -122.22 2 7.2574 52.0 8.288136 1.073446 496.0 2.802260 37.85 -122.24 3 5.6431 52.0 5.817352 1.073059 558.0 2.547945 37.85 -122.25 4 3.8462 52.0 6.281853 1.081081 565.0 2.181467 37.85 -122.25 MedHouseVal 0 4.526 1 3.585 2 3.521 3 3.413 4 3.422
An dieser Stelle sollten Ihnen drei Dinge klar sein:
- Jede Zeile enthält die statistischen Merkmale eines Hauses
- Jede Spalte ist eine Variable, die für die Vorhersage verwendet werden kann
MedHouseValist die Zielvariable, die wir vorhersagen möchten
Teil 3: Explorative Datenanalyse (EDA)
Bevor Sie das Modell trainieren, müssen Sie zunächst eine Frage beantworten:Sind die Daten es wert, daraus zu lernen?
3.1 Datenstruktur und Prüfung auf fehlende Werte
Beispiel: Datenübersicht
print("Ziel-Dimensionen:", df_target.shape)
print("\n"Datentypen und fehlende Werte:")
df_features.info()
print("\n"Statistik fehlender Werte:")
print(df_features.isnull().sum())
Fazit:
- Ausreichende Stichprobengröße (etwa 20,000 Einträge)
- Alle Merkmale sind numerisch
- Keine fehlenden Werte, das Modell kann direkt erstellt werden
3.2 Zusammenhang zwischen einem einzelnen Merkmal und dem Hauspreis
Maschinelles Lernen ist keine Blackbox; zumindest in der Einführungsphase sollten Sie wissen, was das Modell lernt.
Beispiel: Zusammenhang zwischen der Anzahl der Zimmer und dem Hauspreis
plt.figure(figsize=(8, 6))
plt.scatter(df_features['AveRooms'], df_target['MedHouseVal'], alpha=0.4)
plt.xlabel('Durchschnittliche Zimmeranzahl')
plt.ylabel('Median House Value')
plt.title('Rooms vs House Price')
plt.grid(True)
plt.show()
Intuitive Schlussfolgerung: Je mehr Zimmer, desto höher der Hauspreis insgesamt, aber es gibt eine erhebliche Streuung. Genau das ist der Zweck eines Regressionsmodells.
3.3 Merkmalskorrelationsanalyse
Beispiel: Korrelations-Heatmap
df_all = pd.concat([df_features, df_target], axis=1)
corr = df_all.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(corr, cmap='coolwarm', center=0)
plt.title('Feature Correlation Heatmap')
plt.show()
Der Zweck dieses Schritts ist nicht, "ein Modell auszuwählen", sondern zu bestätigen: Es gibt tatsächlich eine erlernbare statistische Beziehung.
Teil 4: Erstellen des ersten Regressionsmodells
4.1 Aufteilung in Trainings- und Testset
Das Modell kann nicht denselben Datenstapel sowohl zum Lernen als auch zum Testen verwenden; andernfalls sind die Evaluierungsergebnisse bedeutungslos.
Beispiel: Datensatzaufteilung
X = df_features
y = df_target['MedHouseVal']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
print("Trainingsset:", X_train.shape)
print("Testset:", X_test.shape)
4.2 Trainieren eines linearen Regressionsmodells
Beispiel: Modelltraining
model = LinearRegression()
model.fit(X_train, y_train)
print("Achsenabschnitt:", model.intercept_)
print("Koeffizienten:")
for name, coef in zip(X.columns, model.coef_):
print(f"{name}: {coef:.4f}")
Der Vorteil der linearen Regression ist:starke Interpretierbarkeit,geeignet für das Verständnis des Wesens von Regressionsproblemen.
Teil 5: Modellvorhersage und Bewertung
5.1 Vergleich der Vorhersageergebnisse
Beispiel: Vorhersagen vs. tatsächliche Werte
result = pd.DataFrame({
"Tatsächlich": y_test.values,
"Vorhergesagt": y_pred
})
print(result.head())
5.2 Quantifizierung des Modells mit Bewertungsmetriken
Beispiel: Bewertungsmetriken
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("MSE:", mse)
print("R2:", r2)
Erklärung:
- Je kleiner der MSE, desto geringer der Vorhersagefehler
- Je näher R² an 1 liegt, desto stärker ist die Erklärungskraft des Modells
Teil 6: Modelloptimierung – Standardisierung und Ridge-Regression
6.1 Warum standardisieren?
Große Unterschiede bei den Merkmalskalen führen dazu, dass das Modell Merkmale mit größeren Werten bevorzugt.
Beispiel: Merkmalsstandardisierung
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
6.2 Verwendung der Ridge-Regression zur Unterdrückung von Overfitting
Beispiel: Ridge-Regression
ridge = Ridge(alpha=1.0)
ridge.fit(X_train_scaled, y_train)
y_pred_ridge = ridge.predict(X_test_scaled)
print("Ridge MSE:", mean_squared_error(y_test, y_pred_ridge))
print("Ridge R2:", r2_score(y_test, y_pred_ridge))
Teil 7: Vollständige Pipeline-Überprüfung
