umz21/lab/04_scikit-learn.ipynb
2022-03-24 11:23:51 +01:00

5.9 KiB
Raw Blame History

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