Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow. Aurélien Géron
beim Erkunden zu erleichtern und sie zu beschleunigen. In unserem Fall ist der Datensatz recht klein, sodass Sie direkt mit den vollständigen Daten arbeiten können. Erzeugen wir eine Kopie, mit der Sie experimentieren können, ohne den Trainingsdatensatz zu beschädigen:
housing = strat_train_set.copy()
Visualisieren geografischer Daten
Weil uns geografische Informationen zur Verfügung stehen (Breite und Länge), sollten wir einen Scatterplot sämtlicher Bezirke erzeugen, um uns die Daten anzusehen (siehe Abbildung 2-11):
housing.plot(kind="scatter", x="longitude", y="latitude")
Abbildung 2-11: Ein geografischer Scatterplot der Daten
In Ordnung, die Abbildung sieht wie Kalifornien aus, aber abgesehen davon ist es schwierig, irgendein Muster zu erkennen. Setzen wir den Parameter alpha auf 0,1, wird es viel einfacher, die Orte mit einer hohen Dichte an Datenpunkten zu erkennen (siehe Abbildung 2-12):
housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.1)
Abbildung 2-12: Eine bessere Darstellung von Gebieten mit hoher Dichte
Das sieht schon viel besser aus: Sie können die Ballungszentren deutlich erkennen, genauer gesagt die Bay Area, den Großraum Los Angeles und San Diego sowie eine lange Reihe einigermaßen hoher Dichte im Central Valley, insbesondere um Sacramento und Fresno.
Unser Gehirn ist sehr gut darin, Muster in Bildern zu erkennen. Sie müssen jedoch mit den Parametern zur Visualisierung experimentieren, damit diese Muster deutlich hervortreten.
Betrachten wir nun die Immobilienpreise (siehe Abbildung 2-13). Der Radius jedes Kreises stellt die Bevölkerung eines Bezirks dar (Option s), und die Farbe repräsentiert den Preis (Option c). Wir verwenden eine vordefinierte Farbskala (Option cmap) namens jet, die von Blau (niedrige Werte) bis Rot (hohe Werte) reicht:16
housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4,
s=housing["population"]/100, label="population", figsize=(10,7),
c="median_house_value", cmap=plt.get_cmap("jet"), colorbar=True,
)
plt.legend()
Abbildung 2-13: Immobilienpreise in Kalifornien: Rot ist teuer, Blau bedeutet günstig, größere Kreise stehen für Bereiche mit mehr Bevölkerung.
In diesem Bild können Sie erkennen, dass die Immobilienpreise stark mit dem Ort (z.B. der Nähe zum Ozean) und der Bevölkerungsdichte zusammenhängen, was Sie vermutlich bereits wussten. Es könnte hilfreich sein, die wichtigsten Cluster mit einem Clustering-Algorithmus zu identifizieren und einige neue Merkmale mit der Entfernung zu den Cluster-Mittelpunkten hinzuzufügen. Die Nähe zum Ozean sollte als Merkmal ebenfalls nützlich sein, obwohl die Immobilienpreise in Nordkalifornien in Küstennähe nicht außerordentlich hoch sind, daher ist dies keine grundsätzliche Regel.
Suche nach Korrelationen
Da Ihr Datensatz nicht besonders groß ist, können Sie mit der Methode corr() den Korrelationskoeffizienten (auch Pearson-Korrelationskoeffizient) für jedes Merkmalspaar leicht berechnen:
corr_matrix = housing.corr()
Schauen wir uns einmal an, wie stark jedes Merkmal mit dem mittleren Immobilienwert korreliert:
>>> corr_matrix["median_house_value"].sort_values(ascending=False)
median_house_value 1.000000
median_income 0.687170
total_rooms 0.135231
housing_median_age 0.114220
households 0.064702
total_bedrooms 0.047865
population -0.026699
longitude -0.047279
latitude -0.142826
Name: median_house_value, dtype: float64
Der Korrelationskoeffizient liegt zwischen –1 und 1. Liegt er nahe bei 1, haben wir eine stark positive Korrelation; zum Beispiel steigt der mittlere Immobilienwert tendenziell mit dem mittleren Einkommen. Ist der Koeffizient nahe bei –1, liegt eine stark negative Korrelation vor; Sie können eine geringe negative Korrelation zwischen der geografischen Breite und dem mittleren Immobilienwert beobachten (d.h., der Preis sinkt tendenziell ein wenig, wenn Sie sich nach Norden bewegen). Schließlich bedeuten Koeffizienten um null, dass es keine lineare Korrelation gibt. Abbildung 2-14 zeigt unterschiedliche Diagramme und den Korrelationskoeffizienten zwischen der horizontalen und vertikalen Achse.
Abbildung 2-14: Korrelationskoeffizienten unterschiedlicher Datensätze (Quelle: Wikipedia; public domain image)
|
Der Korrelationskoeffizient erfasst ausschließlich lineare Korrelationen (»wenn x steigt, steigt/sinkt y im Allgemeinen«). Damit können Sie nichtlineare Zusammenhänge vollständig übersehen (z.B. »wenn x nahe null ist, steigt y«). Beachten Sie, dass sämtliche Diagramme in der unteren Reihe einen Korrelationskoeffizienten von null haben, obwohl ihre Achsen ganz klar nicht unabhängig voneinander sind: Dies sind Beispiele für nichtlineare Zusammenhänge. Auch die zweite Reihe zeigt Beispiele, bei denen der Korrelationskoeffizient 1 oder –1 beträgt; beachten Sie, dass dies nichts mit der Steigung zu tun hat. Ihre Körpergröße in Zoll hat beispielsweise sowohl einen Korrelationskoeffizienten von 1 mit Ihrer Körpergröße in Fuß als auch in Nanometern. |
Eine andere Möglichkeit, nach Korrelationen zwischen Attributen zu suchen, ist die in pandas eingebaute Funktion scatter_matrix(), die jedes numerische Merkmal gegen jedes andere aufträgt. Weil es elf numerische Merkmale gibt, würden Sie 112 = 121 Diagramme erhalten. Da diese aber nicht auf eine Seite passen, konzentrieren wir uns auf einige vielversprechende Merkmale, die am ehesten mit dem mittleren Immobilienpreis korrelieren (siehe Abbildung 2-15):
from pandas.plotting import scatter_matrix
attributes = ["median_house_value", "median_income", "total_rooms",
"housing_median_age"]
scatter_matrix(housing[attributes], figsize=(12, 8))
Die Hauptdiagonale (von oben links nach unten rechts) würde mit lauter geraden Linien gefüllt sein, wenn pandas jedes Merkmal gegen sich selbst plotten würde. Da dies nicht besonders nützlich wäre, stellt pandas stattdessen ein Histogramm jedes Merkmals dar (es gibt dazu einige Alternativen;