5.9 KiB
5.9 KiB
Uczenie maszynowe – zastosowania
Zajęcia laboratoryjne
4. Korzystanie z gotowych implementacji algorytmów na przykładzie pakietu _scikit-learn
Scikit-learn jest otwartoźródłową biblioteką programistyczną dla języka Python wspomagającą uczenie maszynowe. Zawiera implementacje wielu algorytmów uczenia maszynowego.
Poniżej przykład, jak stworzyć klasyfikator regresji liniowej wielu zmiennych z użyciem scikit-learn
.
Na podobnej zasadzie można korzystać z innych modeli dostępnych w bibliotece.
dataset_filename = 'flats.tsv'
data = pd.read_csv(dataset_filename, header=0, sep='\t')
print(data['opis'])
data['ładne w opisie'] = data['opis'].apply(lambda x: True if 'ładne' in str(x) else False)
0 Polecam mieszkanie 2 pokojowe o metrażu 46,68... 1 Ekskluzywna oferta - tylko u nas! Projekt arc... 2 Polecam do kupna przestronne mieszkanie trzyp... 3 Dla rodziny albo pod wynajem. Świetna lokaliz... 4 NaN ... 4933 Trzypokojowe mieszkanie do generalnego remont... 4934 OKAZJA!! LUKSUSOWY APARTAMENT W SĄSIEDZTWIE P... 4935 Jest to oferta nieruchomości z rynku pierwotn... 4936 Mam do sprzedania dom mieszkalny, jednorodzin... 4937 Sprzedaż nowego mieszkania w FAŁKOWIE - Osied... Name: opis, Length: 4938, dtype: object
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression # Model regresji liniowej z biblioteki scikit-learn
from sklearn.metrics import mean_squared_error
FEATURES = [
'Powierzchnia w m2',
'Liczba pokoi',
'Liczba pięter w budynku',
'Piętro',
'Rok budowy',
'ładne w opisie'
]
def preprocess(data):
"""Wstępne przetworzenie danych, np. zamiana wartości tekstowych na liczby"""
data = data.replace({'parter': 0, 'poddasze': 0}, regex=True)
data = data.applymap(np.nan_to_num) # Zamienia "NaN" na liczby
return data
# Nazwy plików
dataset_filename = 'flats.tsv'
# Wczytanie danych
data = pd.read_csv(dataset_filename, header=0, sep='\t')
# Jeżeli chcemy, możemy stworzyć nową cechę (kolumnę) na podstawie istniejącej
# Poniższa cecha mówi, czy kolumna "opis" zawiera słowo "ładne"
data['ładne w opisie'] = data['opis'].apply(
lambda x: True if 'ładne' in str(x) else False)
data = data[FEATURES + ['cena']] # wybór cech
data = data[(data["Powierzchnia w m2"] < 10000) & (data["cena"] > 10000)]
data = preprocess(data) # wstępne przetworzenie danych
# Podział danych na zbiory uczący i testowy
split_point = int(0.8 * len(data))
data_train = data[:split_point]
data_test = data[split_point:]
# Uczenie modelu
y_train = pd.DataFrame(data_train['cena'])
x_train = pd.DataFrame(data_train[FEATURES])
model = LinearRegression() # definicja modelu
model.fit(x_train, y_train) # dopasowanie modelu
# Predykcja wyników dla danych testowych
y_expected = pd.DataFrame(data_test['cena'])
x_test = pd.DataFrame(data_test[FEATURES])
y_predicted = model.predict(x_test) # predykcja wyników na podstawie modelu
print(y_predicted[:10]) # Pierwsze 10 wyników
# Ewaluacja
mse = mean_squared_error(y_predicted, y_expected) # Błąd średniokwadratowy na zbiorze testowym
print("Błąd średniokwadratowy wynosi ", mse)
[[302322.47270869] [283694.74995925] [276290.72977935] [477362.89530745] [420862.62245119] [312510.3868097 ] [362445.20969959] [335753.83506582] [759239.88142398] [684376.72797254]] Błąd średniokwadratowy wynosi 29811493540.217434
Biblioteka _scikit-learn dostarcza również narzędzi do wstępnego przetwarzania danych, np. skalowania i normalizacji: https://scikit-learn.org/stable/modules/preprocessing.html