In meinem vorherigen Beitrag habe ich ein Skript erstellt, um eine CSV-Datei mit Laptop-Daten zu generieren und dabei Web Scraping in PCComponentes durchzuführen.
Diese Idee entstand, als versucht wurde, ein Modell für maschinelles Lernen zu erstellen, das abhängig von den von Ihnen bereitgestellten Komponenten den Preis des Geräts vorhersagt. Bei der Recherche habe ich jedoch einen öffentlichen DataFrame gefunden, mit dem das Modell trainiert werden konnte, der allerdings ein Problem hatte: Die Preise datierten bis ins Jahr 2015, weshalb er kaum von Nutzen war.
Aus diesem Grund habe ich beschlossen, einen DataFrame direkt von der PCComponentes-Website zu erstellen, der es mir ermöglichen würde, über aktuelle und zuverlässige Daten zu verfügen. Darüber hinaus könnte dieser Prozess in Zukunft automatisiert werden (zumindest bis PCComponentes die Struktur seiner Website ändert).
Lasst uns loslegen!
Vor dem Training des Modells müssen die Daten organisiert und bereinigt werden, um das Lesen und Verarbeiten zu erleichtern. Hierzu verwenden wir die Bibliotheken Numpy, Pandas und Matplotlib, die in der Datenanalyse und -verarbeitung weit verbreitet sind.
Der erste Schritt besteht darin, diese Bibliotheken zu importieren und die generierte CSV-Datei zu öffnen:
import pandas as pd import numpy as np import matplotlib.pyplot as plt
Dann löschen wir die Zeilen mit leeren oder Nullwerten:
df = df.dropna()
Beginnen wir mit der Analyse der verschiedenen verfügbaren CPU-Typen. Um sie anzuzeigen, verwenden wir die Seaborn-Bibliothek:
import seaborn as sns sns.countplot(data=df, x='CPU')
Hier sehen wir, dass es 207 verschiedene Arten von CPUs gibt. Das Training eines Modells mit all diesen Werten könnte problematisch sein, da viele Daten irrelevant wären und Rauschen erzeugen würden, das die Leistung beeinträchtigen würde.
Anstatt die gesamte Spalte zu entfernen, filtern wir die relevantesten Werte:
def cpu_type_define(text): text = text.split(' ') if text[0] == 'intel': if 'i' in text[-1]: if text[-1].split('-')[0] == 'i3': return 'low gamma intel processor' return text[0]+' '+text[1]+' '+text[-1].split('-')[0] return 'low gamma intel processor' elif text[0] == 'amd': if text[1] == 'ryzen': if text[2] == '3': return 'low gamma amd processor' return text[0]+' '+text[1]+' '+text[2] return 'low gamma amd processor' elif 'm' in text[0]: return 'Mac Processor' else: return 'Other Processor' data['Cpu'] = data['Cpu'].apply(cpu_type_define) sns.histplot(data=data,x='Cpu') data['Cpu'].value_counts()
Ergebnis:
Wir führen einen ähnlichen Prozess mit Grafikkarten (GPU) durch und reduzieren dabei die Anzahl der Kategorien, um Rauschen in den Daten zu vermeiden:
def gpu_type_define(text): if 'rtx' in text: num = int(''.join([char for char in text if char.isdigit()])) if num == 4080 or num == 4090 or num == 3080: return 'Nvidia High gamma' elif num == 4070 or num == 3070 or num == 4060 or num == 2080: return 'Nivida medium gamma' elif num == 3050 or num == 3060 or num == 4050 or num == 2070: return 'Nvidia low gamma' else: return 'Other nvidia grafic card' elif 'radeon' in text: if 'rx' in text: return 'Amd High gamma' else: return 'Amd low Gamma' elif 'gpu' in text: return 'Apple integrated graphics' return text data['Gpu'] = data['Gpu'].apply(gpu_type_define) sns.histplot(data=data,x='Gpu') data['Gpu'].value_counts()
Ergebnis:
Um die Speicherdaten zu vereinfachen, fassen wir den Gesamtspeicherplatz aller Festplatten zu einem einzigen Wert zusammen:
def fitler_ssd(text): two_discs = text.split('+') if len(two_discs) == 2: return int(''.join([char for char in two_discs[0] if char.isdigit()])) + int(''.join([char for char in two_discs[1] if char.isdigit()])) else: return int(''.join([char for char in text if char.isdigit()])) data['SSD'] = data['SSD'].str.replace('tb','000') data['SSD'] = data['SSD'].str.replace('gb','') data['SSD'] = data['SSD'].str.replace('emmc','') data['SSD'] = data['SSD'].str.replace('ssd','')
Zuletzt filtern wir die RAM-Werte, um nur Zahlen beizubehalten:
import pandas as pd import numpy as np import matplotlib.pyplot as plt
Vor dem Training des Modells müssen die nicht numerischen Spalten in Daten umgewandelt werden, die der Algorithmus interpretieren kann. Hierzu verwenden wir den ColumnTransformer und OneHotEncoder aus der sklearn-Bibliothek:
df = df.dropna()
Ich habe mehrere Algorithmen für maschinelles Lernen getestet, um festzustellen, welcher gemäß dem Bestimmtheitsmaß (R2-Score) am effizientesten war. Hier sind die Ergebnisse:
Modelo | R2 Score |
---|---|
Logistic Regression | -4086280.26 |
Random Forest | 0.8025 |
ExtraTreeRegressor | 0.7531 |
GradientBoostingRegressor | 0.8025 |
XGBRegressor | 0.7556 |
Die besten Ergebnisse wurden mit Random Forest und GradientBoostingRegressor erzielt, beide mit einem R2 nahe 1.
Um mich weiter zu verbessern, habe ich diese Algorithmen mit einem Abstimmungsregressor kombiniert und einen R2-Score von 0,8085 erreicht:
import seaborn as sns sns.countplot(data=df, x='CPU')
Das mit dem Voting Regressor trainierte Modell war am effizientesten. Jetzt sind Sie bereit, es in eine Webanwendung zu integrieren, was ich im nächsten Beitrag ausführlich erläutern werde.
Link zum Projekt
Das obige ist der detaillierte Inhalt vonLaptop-Preisvorhersage mit ML. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!