<jupyter_start><jupyter_text>Viinien luokittelu==============Tässä harjoituksessa tutustutaan viinien maailmaan.**Ongelma**: Voiko viinin laadun päätellä viiniä kuvaavien arvojen perusteella? Data latausLataa Pandas DataFrame-olioina aineistot "../../ml-datasets/winequality-red.csv" ja "../../ml-datasets/winequality-white.csv".<jupyter_code>from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import pandas as pd

def process_data(name, label):
    wine = pd.read_csv(name, index_col=False)
    wine['label'] = label 
    return wine
    
red = process_data("../../ml-datasets/winequality-red.csv", 0)
white = process_data("../../ml-datasets/winequality-white.csv", 1)

wine = pd.concat([red, white])
# Sample sekoittaa aineiston, frac=1 tarkoittaa palauttaa koko aineiston
wine.sample(frac=1).head(10)<jupyter_output><empty_output><jupyter_text>Datan esikäsittelyQuality-arvo vaikuttaa siltä, että se ei ala nollasta. Tarkistetaan tilanne.<jupyter_code>wine.quality.unique()<jupyter_output><empty_output><jupyter_text>Muuta se alkamaan 0:sta. (Vinkki: `df.test_column = df.test_column -1`)<jupyter_code>wine.quality = None<jupyter_output><empty_output><jupyter_text>Muuttujien valintaMuodosta nyt havaintojoukko `X` ja luokkajoukko `y`.Valitse havaintojoukkoon mieleikkäämmät sarakkeet viinidatasta. Saat valittua vain osan sarakkeista alla olevalla tyylillä:```python Olemassa olevatprint(list(df.columns))df = df[['vain', 'halutut', 'sarakkeet']]```Valitse luokiksi `y` laatusarake `quality`. Muista ottaa `y`:n sarake pois `X`:n joukosta.<jupyter_code>y = None
X = None
assert y and X<jupyter_output><empty_output><jupyter_text>JakoJaa luomasi X ja luokat y opetus- ja testijoukkoihin X_train, X_test, y_train ja  y_test siten, että testijoukon osuus on 30% ja opetusjoukon osuus on 70% havainnoista.<jupyter_code>X_train, X_test, y_train, y_test = None, None, None, None
assert X_train<jupyter_output><empty_output><jupyter_text>Datan visualisointiaVisualisoidaan opetusjoukkoa hieman ongelman hahmottamiseksi. Koska valitsemiesi muuttujien määrä voi olla enemmän kuin 2, käytetään PCA-analyysiä visualisoinnin tukena. Muista ajaa alla oleva solu toisen kerran, jos kuva ei heti ilmesty.<jupyter_code>from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt

pca = PCA(n_components=2)
X_train_scaled = StandardScaler().fit_transform(X_train)
X_train_pca = pca.fit_transform(X_train_scaled)
print("Muuttujien määrä oli ennen {}, nyt se on {}".format(len(X.columns), len(X_train_pca[0])))

fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(X_train_pca[:, 0], X_train_pca[:, 1], c=y_train, cmap=plt.cm.Set1,
            edgecolor='k')
ax.set_xlabel('1. ominaisuusvektori')
ax.set_ylabel('2. ominaisuusvektori')
plt.show()<jupyter_output><empty_output><jupyter_text>LuokitteluMuodosta sitten putki ([`Pipeline`](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.htmlsklearn.pipeline.Pipeline)), johon liität StandardScaler ja halutessasi PCA esikäsittelyvaiheet. Lisää putken viimeiseksi komponentiksi haluamasi luokittelija nimelle "clf". Jos käytät Keras-luokittelijaa,  muista luoda funktio sille oletusparametreilla.<jupyter_code>from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline



pipe = None
assert pipe<jupyter_output><empty_output><jupyter_text>Luodaan sitten hyperparametrioptimoinnin tekevä opetusfunktio.<jupyter_code>from sklearn.model_selection import GridSearchCV

def train(pipe, parameters):
    clf = GridSearchCV(pipe, parameters, cv=2, n_jobs=-1)
    clf.fit(X_train, y_train)
    print("Parhaat parametrit: ", clf.best_params_)
    print("Paras opetus OA: {:.4f}".format(clf.best_score_))
    print("OA: {:.4f}".format(clf.score(X_test, y_test)))
    return clf<jupyter_output><empty_output><jupyter_text>EvaluointiLuo vielä funktio evaluointia varten<jupyter_code>from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from utils import plot_confusion_matrix

def evaluate(y_pred):
    cm = confusion_matrix(y_test, y_pred)
    print(classification_report(y_test, y_pred))
    plot_confusion_matrix(cm,list(range(y.max()+1)), list(range(y.max()+1)), normalize=True)<jupyter_output><empty_output><jupyter_text>Mallin opettaminen ja evaluointiAnna toiseksi parametriksi sanakirja hyperparametreista. Putkitusta käytettäessä laita parametrisanakirjaan luokittelijakomponentin nimi ja kaksi alaviivaa ennen parametrin nimeä. Esimerkiksi SVM-algoritmin `C`-parametrin tapauksessa:```pythonparams_without_pipeline = {'C':[1,10]}params_with_pipeline = {'clf__C':[1,10]}```  Jos käytät Keras-mallia, aseta parametreiksi ainakin epochs ja batch_size, esimerkiksi: `{'clf__epochs':[10], 'clf__batch_size':[10]}`.<jupyter_code>params = None
assert params
clf = train(pipe, params)
y_pred = clf.predict(X_test)
evaluate(y_pred)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10928529004157593, 'fraction_numerical': 0.007523262720253415, 'mean_word_length': 7.350413223140496, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 0, '>': 41, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '477645', 'license': 'MIT', 'n_tokens_mistral': 1999, 'n_tokens_neox': 1898, 'n_words': 372, 'path': 'Notebooks/Harjoitus_viinit.ipynb', 'repo_name': 'spatineo/koneoppimiskurssi', 'size': '5051'}