<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Feature engineering
Jakub Ševcech
Obsah
Praca s casom a datumami
Zoskupovanie viacerych pozorovani
Numericke atributy
Normalizacia
Vyrabanie atributov kombinovanim
Suvisiace temy, ktore dnes nestihame
Transformacia kategorickych atributov na numericke
Vyber atributov - Feature selection
Extrakcia atributov
Nevyvazene datasety
Vycerpavajuci zoznam mnozstva veci, co sa da robit na pripravu dat a na feature engineering najdete tu
Step1:  Najskor sa skuste pozriet do dat a skusit tam najst nejake vlastnosti sami.
Napriklad rozbite atributy, kde sa v jednom nachadza viacero hodnot.
Priklad na datach o potopeni Titanicu
https
Step2:  Teraz je tu zopar titulov, ktorych pocty su fakt zanedbatelne a ten model by sa ich tazko ucil. Hrozilo by praveze, ze sa preuci
Chcelo by to aby sa pospajali dohromady.
Napriklad Mlle = Mademoiselle = Miss
Step3:  Velmi pekna ukazka predspracovania na titanic datasete je tu
Step4:  Praca s casom a datumami
Step5:  Cas ako taky velmi vyuzit neviete. To rozlysenie je prilis drobne a ziadny model sa z toho nic nenauci.
Potrebovali by sme ten datum nejak predspracovat.
Identifikator dni by nam uz mohol pomoct. Granularita je podstatne hrubsia a model by to uz mohol vediet vyuzit.
Step6:  Co ked sa dozvieme, ze cez vikend sa v tej miestnosti nekuri a rozhadzuje nam to teplotu v nameranych datach?
Step7:  Takto mozeme pracovat s dnami, tyzdnami, hodinami ....
Vieme vyberat konkretne hodiny a najst napriklad aktivnu cast dna
Mozeme najst rozne fazy dna kde sa ludia spravaju rozne 
uzitocne napriklad pri analyze spravania sa ludi na webe - tesne poobede asi ludia citaju ine clanky ako v produktivnejsej casti dna 
vlastne, rozne dlhe  intervaly
Uloha na doma
Co ked sa v noci tiez nekuri?
Co ked v nejake hodiny svieti cez okno slnko a tiez to rozhadzuje teplotu?
Step8:  Zoskupovanie viacerych pozorovani
Zoskupovanie viacerych transakcii per objekt
Typicke pri sledovani aktivity pouzivatelov kde zoskupujeme per pouzivatel
Napriklad kliknutia na stranky alebo operacie v banke
Ukazeme si zopar prikladov na datach o bankovych operaciach nedzi roznymi uctami.
Je to typicky priklad transakcnych dat
http
Step9:  Rozne typy operacii maju uplne ine vlastnosti. Mohli by sme to pouzit na to, aby sme vytvorili nove atributy, ktore budu tieto skupiny oddelovat.
Step10:  Podobny vysledok viem dosiahnut aj operaciou merge (join v SQL)
je to trochu rychlejsie aj ked lambda mi dava podstatne sirsie moznosti operacii
Step11:  Podobnym sposobom mozete vyrobit velmi vela roznych atributov
nepridat len priemer, ale aj pomer, >, < alebo rozdiel medzi priemerom a aktualnou hodnotou
priemer per account => odrazi zvyky konkretneho zakaznika
viete pouzit hociaky kategoricky atribut an vytvorenie segmentov
agregovanie inych atributov
agregovanie v casovom okne
ine agregacne funkcie
Step12:  Rozne algoritmy mozu mat s takymto rozdelenim problem. 
Logisticka regresia, neuronova siet alebo hocico, co pouziva vahy na atributoch
Aku mate dat vahu atributu ak ma rozsah od 0 do 10^6 a vacsina hodnot je sustredena na jednu stranu? 
Velke hodnty vam budu velmi ovplyvnovat cely vypocet a nebudete vediet rozlysit tie male.
Step13:  namiesto box-cox by sa dal pouzit logaritmus povodnej hodnoty, ale to je hack. box-cox sa dokaze postarat o to, aby sa vysledne rozelenie podobalo normalnemu
Step14:  Toto sa uz trochu podoba na normalne rozdelenie ale nie je normalizovane
Zakladny typ normalizacie (skalovania) je vydelit na opravenie skaly a odcitat nieco na opravu posunutia
Step15:  z-normalization
Step16:  Skalovanie / normalizacia nie je dolezita len pri trenovani modelu.
PCA (redukcia dimenzionality) napriklad to potrebuje tiez
PCA sa snazi vysvetlit varianciu v datach co najmensim poctom atributov. Vie ovahovat atributy datasetu podla toho kolko je v nich variancie a s takou vahou ich pouziva. Ak mate nenormalizovany atribut, ktory ma varianciu ovela vacsiu ako ostatne, tak bude vo vysledkej reprezentacii odrazeny velmi silno na ukor ostatnych. Nie vzdy to chcete. 
Vyrabanie atributov kombinovanim
Niekedy vam samotny atribut velmi nepomoze. Ak ho ale nejak skombinujete s inym, tak uz moze. 
Napriklad mate dataset aut, kde je spotreba a velkost nadrze. Tieto atributy su fajn, ale ak ich medzi sebou prenasobite, tak dostanete dojazd co moze tiez velmi dolezite pri vybere auta.
Na toto obycajne potrebujete domenovu znalost. Tento proces sa ale da do nejakej miery automatizovat.
Polynomialne kombinovanie
Step17:  a^0, a, b, a^2, ab, b^2, a^3, a^2b, a*b^2, b^3
Znovu si zoberiem data z Titanicu
Step18:  nevieme pouzivat prazdne hodnoty pri vypocte polynomialnych vlastnosti
rozdelime si data na zavisle a nezavisle premenne
Step19:  Nemozeme pouzivat kategoricke atributy. Len numericke
Step20:  ak by ste chceli zachovat rozumne nazvy stlpcov
Step21:  Tramtadada .... vysledok pre nase kombinovane data
Step22:  Nanestastie tieto Polynomialne vlastnosti vyrabaju len mocniny a nasobky
Daju sa ale spravit vlastne transformatory
<ASSISTANT_TASK:>
Python Code:
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn
plt.rcParams['figure.figsize'] = 9, 6
from IPython.display import Image
Explanation: Feature engineering
Jakub Ševcech
Obsah
Praca s casom a datumami
Zoskupovanie viacerych pozorovani
Numericke atributy
Normalizacia
Vyrabanie atributov kombinovanim
Suvisiace temy, ktore dnes nestihame
Transformacia kategorickych atributov na numericke
Vyber atributov - Feature selection
Extrakcia atributov
Nevyvazene datasety
Vycerpavajuci zoznam mnozstva veci, co sa da robit na pripravu dat a na feature engineering najdete tu: http://www.datasciencecentral.com/profiles/blogs/feature-engineering-data-scientist-s-secret-sauce-1
Nanestastie je to len zoznam
Celkom pekny zoznam krokov a aj metod je tu: http://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/
Zopar najcastejsie pouzivanych veci z toho vyberiem a ukazem na co je to dobre
End of explanation
titanic = pd.read_csv('titanic/train.csv')
titanic.head()
import re
titanic.Name.apply(lambda x: re.split('[,.]', x)).head(10)
titanic.Name.apply(lambda x: re.split('\s*[,.]\s*', x)).head(10)
set(titanic.Name.apply(lambda x: re.split('\s*[,.]\s*', x)[1]))
titanic['title'] = titanic.Name.apply(lambda x: re.split('\s*[,.]\s*', x)[1])
titanic.title.head(10)
titanic.title.value_counts()
Explanation: Najskor sa skuste pozriet do dat a skusit tam najst nejake vlastnosti sami.
Napriklad rozbite atributy, kde sa v jednom nachadza viacero hodnot.
Priklad na datach o potopeni Titanicu
https://www.kaggle.com/c/titanic
End of explanation
titanic.loc[titanic.title == 'Mlle', 'title'] = 'Miss'
titanic.loc[titanic.title == 'Mme', 'title'] = 'Mrs'
titanic.loc[titanic.title.isin(['Capt', 'Don', 'Major']), 'title'] = 'Sir'
titanic.loc[titanic.title.isin(['Dona', 'Lady', 'the Countess', 'Jonkheer']), 'title'] = 'Lady'
titanic.groupby('title').size().plot(kind='bar')
Explanation: Teraz je tu zopar titulov, ktorych pocty su fakt zanedbatelne a ten model by sa ich tazko ucil. Hrozilo by praveze, ze sa preuci
Chcelo by to aby sa pospajali dohromady.
Napriklad Mlle = Mademoiselle = Miss
End of explanation
url = 'http://www.datasciencecentral.com/profiles/blogs/predicting-flights-delay-using-supervised-learning'
from IPython.display import IFrame
IFrame(url, width=700, height=350)
Explanation: Velmi pekna ukazka predspracovania na titanic datasete je tu: http://trevorstephens.com/kaggle-titanic-tutorial/r-part-4-feature-engineering/
Niekedy ma zmysel upravovat nielen nezavisle premenne (atributy), ale aj tie zavisle (predikovana hodnota)
Napriklad pri predikovani casu pristania lietadla nieje uplne dobry napad predikovat ten cas, ale skor dobu letu a potom ju len pripocitat k casu vzlietnutie
End of explanation
# https://archive.ics.uci.edu/ml/datasets/Occupancy+Detection+#
# klasifikacia, ci je miestnost obsadena alebo nie na zaklade udajov zo senzorov
occupancy = pd.read_csv('occupancy/datatraining.txt', sep=',')
date = pd.to_datetime(occupancy.date, format='%Y-%m-%d %H:%M:%S')
occupancy.date = date
occupancy.head()
Explanation: Praca s casom a datumami
End of explanation
occupancy['weekday'] = occupancy.date.dt.weekday
occupancy.head()
Explanation: Cas ako taky velmi vyuzit neviete. To rozlysenie je prilis drobne a ziadny model sa z toho nic nenauci.
Potrebovali by sme ten datum nejak predspracovat.
Identifikator dni by nam uz mohol pomoct. Granularita je podstatne hrubsia a model by to uz mohol vediet vyuzit.
End of explanation
occupancy['weekend'] = False
occupancy.loc[occupancy.weekday.isin([5, 6]), 'weekend'] = True
occupancy.tail()
occupancy.weekend.value_counts()
Explanation: Co ked sa dozvieme, ze cez vikend sa v tej miestnosti nekuri a rozhadzuje nam to teplotu v nameranych datach?
End of explanation
# rozne atributy, ktore sa daju vytiahnut z casovej peciatky
url = 'http://pandas.pydata.org/pandas-docs/stable/api.html#datetimelike-properties'
IFrame(url, width=1000, height=350)
Explanation: Takto mozeme pracovat s dnami, tyzdnami, hodinami ....
Vieme vyberat konkretne hodiny a najst napriklad aktivnu cast dna
Mozeme najst rozne fazy dna kde sa ludia spravaju rozne 
uzitocne napriklad pri analyze spravania sa ludi na webe - tesne poobede asi ludia citaju ine clanky ako v produktivnejsej casti dna 
vlastne, rozne dlhe  intervaly
Uloha na doma
Co ked sa v noci tiez nekuri?
Co ked v nejake hodiny svieti cez okno slnko a tiez to rozhadzuje teplotu?
End of explanation
trans = pd.read_csv('berka/trans.asc', sep=';', nrows=1000)
trans.head()
date = pd.to_datetime(trans.date, format='%y%m%d')
trans.date = date
trans.head()
Explanation: Zoskupovanie viacerych pozorovani
Zoskupovanie viacerych transakcii per objekt
Typicke pri sledovani aktivity pouzivatelov kde zoskupujeme per pouzivatel
Napriklad kliknutia na stranky alebo operacie v banke
Ukazeme si zopar prikladov na datach o bankovych operaciach nedzi roznymi uctami.
Je to typicky priklad transakcnych dat
http://lisp.vse.cz/pkdd99/berka.htm
End of explanation
means = trans.groupby('operation').amount.mean()
means
trans['mean_amount_per_operation'] = trans.apply(lambda x: 0 if pd.isnull(x['operation']) else means[x['operation']], axis=1)
trans.tail()
Explanation: Rozne typy operacii maju uplne ine vlastnosti. Mohli by sme to pouzit na to, aby sme vytvorili nove atributy, ktore budu tieto skupiny oddelovat.
End of explanation
means_df = pd.DataFrame(means)
means_df.columns = ['mean_amount_per_operation']
means_df['operation'] = means_df.index
means_df.index = range(len(means_df))
means_df
pd.merge(trans, means_df, how='left', on='operation')
Explanation: Podobny vysledok viem dosiahnut aj operaciou merge (join v SQL)
je to trochu rychlejsie aj ked lambda mi dava podstatne sirsie moznosti operacii
End of explanation
# data o komunikacii pocitacov v sieti z www.neteye-blog.com/netcla-the-ecml-pkdd-network-classification-challenge/
# uloha je klasifikovat aka aplikacia data generovala
data_file = "../vos/challenge/NetCla/data/train.csv"
netcla = pd.read_csv(data_file, nrows=1000, sep='\t')
netcla.head()
netcla.info()
# seaborn.pairplot(netcla) # toto nije dobry napad. Tych atributov je strasne vela a kazdy s kazdym je dost velka matica
plt.rcParams['figure.figsize'] = 18, 12
netcla.hist()
plt.rcParams['figure.figsize'] = 9, 6
pom = netcla.throughput.hist(bins=50)
pom.set_title('throughput')
Explanation: Podobnym sposobom mozete vyrobit velmi vela roznych atributov
nepridat len priemer, ale aj pomer, >, < alebo rozdiel medzi priemerom a aktualnou hodnotou
priemer per account => odrazi zvyky konkretneho zakaznika
viete pouzit hociaky kategoricky atribut an vytvorenie segmentov
agregovanie inych atributov
agregovanie v casovom okne
ine agregacne funkcie: count, std, kvartily ....
viete dokonca vytvorit nove kategoriccke atributy podla ktorych ma zmysel agregovat pomocou zhlukovania
Numericke atributy
co zaujimave sa da robit s nimi?
End of explanation
from scipy.stats import boxcox 
Explanation: Rozne algoritmy mozu mat s takymto rozdelenim problem. 
Logisticka regresia, neuronova siet alebo hocico, co pouziva vahy na atributoch
Aku mate dat vahu atributu ak ma rozsah od 0 do 10^6 a vacsina hodnot je sustredena na jednu stranu? 
Velke hodnty vam budu velmi ovplyvnovat cely vypocet a nebudete vediet rozlysit tie male.
End of explanation
# boxcox vrati transformovane data a parametre transformacie. Tie viem zafixovat a v tom pripade mi to vrati len transformovane data
transformed, att = boxcox(netcla.throughput+1)# nevieme transformovat 0 a zaporne hodnoty. preto + 1
pom = pd.Series(transformed).hist(bins=50)
pom.set_title('throughput (box-cox)')
Explanation: namiesto box-cox by sa dal pouzit logaritmus povodnej hodnoty, ale to je hack. box-cox sa dokaze postarat o to, aby sa vysledne rozelenie podobalo normalnemu
End of explanation
def normalization(data, shift, scale): 
    return (np.array(data) - float(shift))/scale
Explanation: Toto sa uz trochu podoba na normalne rozdelenie ale nie je normalizovane
Zakladny typ normalizacie (skalovania) je vydelit na opravenie skaly a odcitat nieco na opravu posunutia
End of explanation
z_transformed = normalization(transformed, np.mean(transformed), np.std(transformed))
pom = pd.Series(z_transformed).hist(bins=50)
pom.set_title('throughput (Z-normalization)')
Explanation: z-normalization: shift = mean, scale = std
0-1 normalization: shift = min, scale =  max - min
kvartily na odstranenie outlierov
Nemusite to programovat. Sklearn uz ma nieco pripravene
toto iste robi sklearn.preprocessing.StandardScaler pre vsetky atributy. Pozor ale na power law
ak pouzijete RobustScaler, tak si viete poradit aj s outliermi (pouziva rozsah 1st quartile (25th quantile) and the 3rd quartile (75th quantile))
End of explanation
X = np.arange(6).reshape(3, 2)
X
from sklearn import preprocessing
poly = preprocessing.PolynomialFeatures(3)
poly.fit_transform(X) # vytvorenie polynomialnych kombinacii
Explanation: Skalovanie / normalizacia nie je dolezita len pri trenovani modelu.
PCA (redukcia dimenzionality) napriklad to potrebuje tiez
PCA sa snazi vysvetlit varianciu v datach co najmensim poctom atributov. Vie ovahovat atributy datasetu podla toho kolko je v nich variancie a s takou vahou ich pouziva. Ak mate nenormalizovany atribut, ktory ma varianciu ovela vacsiu ako ostatne, tak bude vo vysledkej reprezentacii odrazeny velmi silno na ukor ostatnych. Nie vzdy to chcete. 
Vyrabanie atributov kombinovanim
Niekedy vam samotny atribut velmi nepomoze. Ak ho ale nejak skombinujete s inym, tak uz moze. 
Napriklad mate dataset aut, kde je spotreba a velkost nadrze. Tieto atributy su fajn, ale ak ich medzi sebou prenasobite, tak dostanete dojazd co moze tiez velmi dolezite pri vybere auta.
Na toto obycajne potrebujete domenovu znalost. Tento proces sa ale da do nejakej miery automatizovat.
Polynomialne kombinovanie
End of explanation
titanic = pd.read_csv('titanic/train.csv')
titanic.head()
Explanation: a^0, a, b, a^2, ab, b^2, a^3, a^2b, a*b^2, b^3
Znovu si zoberiem data z Titanicu
End of explanation
titanic_X = titanic.dropna().reindex(columns=[x for x in titanic.columns.values if x != 'Survived']).reset_index(drop=True)
titanic_y = titanic.dropna().reindex(columns=['Survived']).reset_index(drop=True)
titanic_X
poly = preprocessing.PolynomialFeatures(2) 
# pozor na prilis velke cislo. Vznikne vela atributov a hrozi ze budete mat malo dat na natrenovanie
polynomial_titanic = poly.fit_transform(titanic_X)
Explanation: nevieme pouzivat prazdne hodnoty pri vypocte polynomialnych vlastnosti
rozdelime si data na zavisle a nezavisle premenne
End of explanation
polynomial_titanic = poly.fit_transform(titanic_X._get_numeric_data())
polynomial = pd.DataFrame(polynomial_titanic)
polynomial.head()
titanic_X._get_numeric_data().shape
Explanation: Nemozeme pouzivat kategoricke atributy. Len numericke
End of explanation
# berieme len numericke data aby sme mali rovnake podmienky
original = titanic.dropna()._get_numeric_data()
original.head()
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(max_depth=5)
cross_validation_results = cross_val_score(clf, 
                                           original[original.columns[original.columns != 'Survived']], 
                                           original['Survived'], cv=6)
(cross_validation_results.mean(), cross_validation_results.std())
cross_validation_results
Explanation: ak by ste chceli zachovat rozumne nazvy stlpcov: http://stackoverflow.com/questions/36728287/sklearn-preprocessing-polynomialfeatures-how-to-keep-column-names-headers-of
Dobre, skusme natrenovat model a pozriet sa ako nam tieto polynomialne vlastnosti zmenia uspesnost
Najskor povodne data
End of explanation
# pricapime naspat info o triedach
polynomial['Survived'] = titanic_y
polynomial.head()
from sklearn.model_selection import cross_val_score
# clf = LogisticRegression()
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(max_depth=5)
cross_validation_results = cross_val_score(clf, 
                                           polynomial[polynomial.columns[polynomial.columns != 'Survived']], 
                                           polynomial['Survived'], cv=6)
(cross_validation_results.mean(), cross_validation_results.std())
cross_validation_results
Explanation: Tramtadada .... vysledok pre nase kombinovane data
End of explanation
import numpy as np
from sklearn.preprocessing import FunctionTransformer
transformer = FunctionTransformer(np.log1p)
X = np.array([[0, 1], [2, 3]])
transformer.transform(X)
Explanation: Nanestastie tieto Polynomialne vlastnosti vyrabaju len mocniny a nasobky
Daju sa ale spravit vlastne transformatory
End of explanation
<END_TASK>