#!/usr/bin/env python
# coding: utf-8
#
#
# Karar Ağaçları (Decision Tree) Kullanarak Hava Durumu
# Sınıflandırması
# scikit-learn
#
#
#
# Günlük Hava Durumu Analizi
#
#
#
#
# Gerekli Kütüphanelerin İçe Aktarılması
# In[40]:
import pandas as pd
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from IPython.display import Image, display,HTML
CSS = """
.output {
flex-direction: row;
}
"""
HTML(''.format(CSS))
#
#
# CSV Dosyası ile Pandas DataFrame oluşturma
#
# In[6]:
url='https://raw.githubusercontent.com/cagriemreakin/Machine-Learning/master/classification/weather/daily_weather.csv'
# In[7]:
data = pd.read_csv(url)
# Hakkında
#
# San Diego,California eyaletine ait 2011 - 2014 arasındaki hava durumu değerleridir.Meteroloji binasındaki sensorler tarafında sıcaklık, basınç ve nemdeğerleri kayıt yaz-kış bütün mevsimler için kayıt altına alınmıştır.
#
# Şimdi bu değerleri kullanark hava durumu için analiz yapalım.
# In[9]:
data.columns
#
# Dataset içindeki değerlerin açıklaması:
#
# * **number:** satır sayısı
# * **air_pressure_9am:** 8:55 to 9:04 arasındaki ortalama basınç (*Unit: hectopascals*)
# * **air_temp_9am:** 8:55 to 9:04 arasındaki ortalama sıcaklık (*Unit: degrees Fahrenheit*)
# * **air_wind_direction_9am:** 8:55 to 9:04 arasındaki ortalama rüzgar yönü (*Unit: degrees, with 0 means coming from the North, and increasing clockwise*)
# * **air_wind_speed_9am:** 8:55 to 9:04 arasındaki ortalama rüzgar hızı (*Unit: miles per hour*)
# * ** max_wind_direction_9am:** 8:55 to 9:04 arasındaki ortalama kuvvetli rüzgar (*Unit: degrees, with 0 being North and increasing clockwise*)
# * **max_wind_speed_9am:** 8:55 to 9:04 arasındaki ortalama kuvvetli rüzgar hızı (*Unit: miles per hour*)
# * **rain_accumulation_9am:** 24 saatlik yağmur miktarı (*Unit: millimeters*)
# * **rain_duration_9am:**24 saat içindeki yağmur yağma süresi(*Unit: seconds*)
# * **relative_humidity_9am:**Ortalama bağıl nem 8:55 ila 9:04 arasındaki . (*Unit: percent*)
# * **relative_humidity_3pm:** Ortalama bağıl nem 2:55 ila 3:04 arasındak (*Unit: percent *)
#
# In[12]:
data.head(10)
# Veri işlemenin ilk adımı temiz bir veri elde etmektir.Hücredeki boş (null)değerler hesaplamaların yanlış olmasına sebep olabilir.Satırlardaki boş değerleri bulalım.
# In[14]:
data[data.isnull().any(axis=1)]
#
#
# Gereksiz Veri'den Kurtulalım
#
# Kaç tane satır sayısına ihtiyacımız olmadığı için silelim.
# In[15]:
del data['number']
# boş değerleri pandas dropna fonksiyonunu kullanarak silelim
# In[20]:
silmeden_once = data.shape[0]
print(silmeden_once)
# In[17]:
data = data.dropna()
# In[18]:
sildikten_sonra = data.shape[0]
print(print(sildikten_sonra))
#
#
# Temizleme işleminden sonra kalan satır sayısı?
#
#
#
# In[22]:
silmeden_once - sildikten_sonra
#
# Sınıflandırma İşlemi
# İkili sistemde sınıflandırma relative_humidity_3pm (saat 3'teki nispi nem miktarı) to 0 or 1.
#
#
# In[23]:
clean_data = data.copy() #temizlediğimiz veri setini kopyaladık
clean_data['high_humidity_label'] = (clean_data['relative_humidity_3pm'] > 24.99)*1 #nem oranı 24.99'dan büyük olanları 1 olarak işaretle
print(clean_data['high_humidity_label'])
#
#
# Sonucu 'y' de sakla.
#
#
# In[27]:
y=clean_data[['high_humidity_label']].copy()
#y
# In[25]:
clean_data['relative_humidity_3pm'].head()
# In[29]:
y.head() # 25 ve büyük değerler için 1 olarak işaretlendi
#
#
# Saat 3'teki Nem miktarını bulmak için Saat 9'daki sensor değerlerini kullanalım
#
#
# In[35]:
morning_features = ['air_pressure_9am','air_temp_9am','avg_wind_direction_9am','avg_wind_speed_9am',
'max_wind_direction_9am','max_wind_speed_9am','rain_accumulation_9am',
'rain_duration_9am']
# In[36]:
X = clean_data[morning_features].copy()# morning features'ın içindeki indeklere göre cleandata değerlerini Z' e kopyalam işelemi
# In[37]:
X.columns
# In[38]:
y.columns
#
#
#
# Test ve Eğitim(Train) Kümeleri Oluşturma
#
#
#
#
# ## Hatırlatma: Eğitim Evresi
#
#
# In[41]:
display(Image(filename="C:\\Users\\ceakn\\Desktop\\site-resimler\\class_apply.png", embed=True))
# In[42]:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=324)
# Yukarıdaki kodun amacı daha önceki yazımda anlattığım test ve eğitim veri setini oluşturmaktır.Yukarıdaki kodda test için veri setinin %33 ü ayrılmıştır.
# In[46]:
#type(X_train)
#type(X_test)
#type(y_train)
#type(y_test)
#X_train.head()
#y_train.describe()
#
#
# Fit on Train Set
#
#
# In[47]:
humidity_classifier = DecisionTreeClassifier(max_leaf_nodes=10, random_state=0) # 10 adet leaf node' a izin verdik ve ağacı oluşturduk.
humidity_classifier.fit(X_train, y_train)
# In[48]:
type(humidity_classifier)
#
#
# Test Kümesinden Çıkarım Yapma
#
#
#
# In[49]:
predictions = humidity_classifier.predict(X_test)
# In[50]:
predictions[:10]
# In[51]:
y_test['high_humidity_label'][:10]
# Yukarıdaki değerlere bakarsanız 2 değeriin farklı olduğunu görebilirsiniz.
#
#
# Başarı Oranını Hesaplama
#
#
# In[52]:
accuracy_score(y_true = y_test, y_pred = predictions)
# % 81 başarı