#!/usr/bin/env python # coding: utf-8 # ## Drzewo decyzyjne - RMS Titanic # In[1]: import pandas as pd from bs4 import BeautifulSoup import requests # ### Pobieramy dane # In[2]: url = "https://www.encyclopedia-titanica.org/titanic-passengers-and-crew/" strona = requests.get(url).text # #### Szukamy tabel na stronie # In[3]: soup = BeautifulSoup(strona,"html.parser") table = soup.find('table') # #### Korzystając z silnika bs4 zapisujemy pierwszą tabelę # In[4]: data = pd.read_html(str(table), flavor = 'bs4')[0] # In[5]: print(data.shape) # In[6]: data.head() # #### Usuwamy nieważne dane # In[7]: data = data[["Name","Age","Class/Dept","Boat [Body]"]] # In[8]: data.head() # In[9]: data["Boat [Body]"]= data["Boat [Body]"].fillna("") # In[10]: data.head() # ### Tworzymy kolumnę przetrwania # In[11]: def przetrwanie(val): if val=="" or "[" in val: return 0 else: return 1 # In[12]: data["Przetrwanie"] = data["Boat [Body]"].apply(przetrwanie) # #### Zastępujemy napis liczby liczbą # In[14]: data["Age"] = data["Age"].apply(pd.to_numeric, errors = "coerce") # In[15]: data.head() # #### Tworzymy kolumnę klasa # In[19]: def jaka_klasa(klasa): if "Passenger" in klasa: return klasa.split()[0][0] else: return "Załoga" # In[20]: data["Klasa"] = data["Class/Dept"].apply(jaka_klasa) # In[21]: data.head() # #### Tworzymy kolumnę dorosłości # In[22]: def jaka_grupa(wiek): if wiek<18: return "Dziecko" else: return "Dorosły" # In[23]: data["Dziecko/Dorosły"] = data["Age"].apply(jaka_grupa) # In[24]: data.head() # #### Tworzymy kolumnę płci # In[25]: def jaka_plec(imie): po_przecinku = imie[imie.index(",")+2:].split(" ") forma = po_przecinku[0] if forma in ["Mr","Master", "Sig.", "Sr."]: return "Mężczyzna" else: return "Kobieta" # In[26]: data["Płeć"] = data["Name"].apply(jaka_plec) # In[27]: data.head() # #### Garść informacji o zbiorze # In[28]: data.groupby(["Płeć"])["Name"].count() # In[29]: data.groupby(["Płeć"])["Przetrwanie"].sum() # In[30]: def porownanie_przezywalnosci(grupa): return data.groupby([grupa])["Przetrwanie"].sum()/data.groupby([grupa])["Przetrwanie"].count() # In[31]: porownanie_przezywalnosci("Płeć") # In[32]: porownanie_przezywalnosci("Klasa") # In[33]: porownanie_przezywalnosci("Dziecko/Dorosły") # In[34]: data.head() # In[35]: train = data[["Płeć","Klasa","Age","Dziecko/Dorosły","Przetrwanie"]] # In[36]: train.head() # #### Zamiana wartości kategorycznych na liczby # In[37]: def toNum(val): val = val.astype('category') return val.cat.codes train2 = train[["Klasa","Dziecko/Dorosły","Płeć"]].apply(toNum) train[["Klasa","Dziecko/Dorosły","Płeć"]] = train2 train.head() # In[38]: train.isnull().sum() # In[39]: len(train) # In[40]: train = train.dropna() # In[41]: len(train) # In[42]: train.isnull().sum() # In[43]: train.head() # In[44]: def corrplot(df): return df.corr() corrplot(train) # ## Nauka modelu # In[48]: from sklearn.model_selection import train_test_split # ### Dzielimy zbiór na treningowy oraz testownik # In[49]: train,test = train_test_split(train, test_size = 0.2) # In[50]: train.head() # In[51]: len(train)+len(test) # ## Importujemy i tworzymy [...] # In[52]: from sklearn.tree import DecisionTreeClassifier # In[61]: drzewko = DecisionTreeClassifier(max_leaf_nodes=10) # In[62]: drzewko # In[63]: drzewko = drzewko.fit(train[["Klasa","Age","Dziecko/Dorosły","Płeć"]], train["Przetrwanie"]) # In[64]: dict(zip(["Klasa","Age","Dziecko/Dorosły","Płeć"],list(drzewko.feature_importances_))) # ### Tworzymy graf drzewa decyzyjnego # In[68]: from sklearn import tree with open("titanic.dot", "w") as f: f = tree.export_graphviz(drzewko, feature_names = ["Klasa","Age","Dziecko/Dorosły","Płeć"], out_file = f) # In[65]: predictions = drzewko.predict(test[["Klasa","Age","Dziecko/Dorosły","Płeć"]]) # In[66]: from sklearn.metrics import accuracy_score # ### Sprawdzamy dokładność predykcji # In[67]: accuracy_score(test["Przetrwanie"], predictions) # ## Random Forest # In[ ]: from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier() # In[ ]: rf # In[ ]: def jaka_skutecznosc(rf): rf = rf.fit(train[["Klasa","Age","Dziecko/Dorosły","Płeć"]], train["Przetrwanie"]) predictions = rf.predict(test[["Klasa","Age","Dziecko/Dorosły","Płeć"]]) return accuracy_score(test["Przetrwanie"],predictions) # In[ ]: jaka_skutecznosc(rf) # # The Koniec # In[ ]: