Python ile Makine Öğrenmesine Giriş¶
Elimizde yaş ve cinsiyetlere göre müzik tarzını belirten bir veri seti bulunmaktadır. Bu veri setini kullanarak oluşturacağımız bir makine öğrenmesi modeli ile yaş ve cinsiyeti verilen kişinin müzik tarzını tahmin etmeyi öğreneceğiz.
Veri Seti (music.csv)
age,gender,genre
20,1,HipHop
23,1,HipHop
25,1,HipHop
26,1,Jazz
29,1,Jazz
30,1,Jazz
31,1,Classical
33,1,Classical
37,1,Classical
20,0,Dance
21,0,Dance
25,0,Dance
26,0,Acoustic
27,0,Acoustic
30,0,Acoustic
31,0,Classical
34,0,Classical
35,0,Classical
Python Kodu üzerindeki yorum satırlarını okuyarak bu yazıyı takip ediniz.
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
df_musicdata= pd.read_csv('mldataset/music.csv')
# genre(tarz) sütunundaki verileri kaldırıp sadece yaş ve cinsiyet verilerini alarak X değişkenine atama yap
X = df_musicdata.drop(columns=['genre'])
# genre(tarz) sütunundaki verileri y değişkenine atama yap
y = df_musicdata['genre']
# train_test_split fonksiyonu ile %20 test %80 train(eğitim) verisi olarak kullanmak üzere
# veri setini parçala
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# Makine öğrenmesi sınıflandırma algoritmasını(model) Karar Ağacı olarak kullan
model = DecisionTreeClassifier()
# model'i X eğitim ve y eğitim verileri ile hazırla
model.fit(X_train, y_train)
"""
# manuel olarak yaşı 21 cinsiyeti erkek(1) olan yaşı 22 cinsiyeti kadın(0) olan kişilerin
# hangi tarz müzik sevdiğini aşağıdaki gibi tahmin edebiliriz.
# predictions = model.predict([ [21,1], [22,0] ])
"""
# train_test_split fonksiyonu ile veri setini parçalayıp edindiğimiz X test veri setini aşağıdaki gibi tahmin edebiliriz.
predictions = model.predict(X_test)
# aşağıdaki fonksiyon ile oluşturduğumuz makine öğrenmesi modelinin doğruluğunu kontrol edebiliriz.
accuracy_score(y_test, predictions) # Bir kaç defa çalıştırdıktan sonra 1.0, 0.75, 0.5 gibi doğruluk değerleri ediniyoruz.
# Eğer test_size=0.2 yani %20 yerine daha yüksek verilseydi yani eğitim(train) için %80'den daha düşük değerler verilseydi
# accuracy_score yani doğruluk skoru(değeri, oranı) daha düşük olacaktı.
# denemek için test_size=0.8 olacak şekilde verirsek
# 0.6, 0.2, 0.4, 0.4666666666666667, 0.13333333333333333, 0.26666666666666666 gibi doğruluk skorları ediniriz.
Makine Öğrenmesi ile Oluşturulan(Eğitilen) Modelin Kaydedilmesi Makine Öğrenmesi modelinin eğitilmesi bazen uzun sürebilir. Yeni verilerle tahmin yaparken tekrar tekrar modeli eğitmek zaman israfı olacaktır. Aşağıdaki yapıyı kullanarak oluşturduğumuz modeli kaydedip daha sonra yeni verilerle bu modeli kullanarak tahmin yapabiliriz.
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
import joblib
df_musicdata= pd.read_csv('mldataset/music.csv')
X = df_musicdata.drop(columns=['genre'])
y = df_musicdata['genre']
model = DecisionTreeClassifier()
model.fit(X, y)
joblib.dump(model, 'music-recommender.joblib')
8004 954d 0200 0000 0000 008c 1573 6b6c
6561 726e 2e74 7265 652e 5f63 6c61 7373
6573 948c 1644 6563 6973 696f 6e54 7265
...
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
import joblib
#LOAD MODEL
model = joblib.load('music-recommender.joblib')
predictions = model.predict([ [21,1] ]) # yaşı 21 olan bir erkek(1) için müzik tarzını tahmin et.
print(predictions) # array(['HipHop'], dtype=object)
Karar Ağacının Görselleştirilmesi¶
Kullandığımız veri setine göre oluşturduğumuz modeli .dot uzantılı olarak kaydedip görselleştirmeyi VScode'da Graphviz (dot) extension'ı ile yapabiliriz.
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
df_musicdata= pd.read_csv('mldataset/music.csv')
X = df_musicdata.drop(columns=['genre'])
y = df_musicdata['genre']
model = DecisionTreeClassifier()
model.fit(X, y)
tree.export_graphviz(model, out_file='music-recommender.dot',
feature_names=['age','gender'],
class_names=sorted(y.unique()),
label='all', rounded=True,
filled=True
)
- music-recommender.dot adındaki dosyanın içeriği aşağıdaki gibidir.
digraph Tree {
node [shape=box, style="filled, rounded", color="black", fontname=helvetica] ;
edge [fontname=helvetica] ;
0 [label="age <= 30.5\ngini = 0.778\nsamples = 18\nvalue = [3, 6, 3, 3, 3]\nclass = Classical", fillcolor="#e5fad7"] ;
1 [label="age <= 25.5\ngini = 0.75\nsamples = 12\nvalue = [3, 0, 3, 3, 3]\nclass = Acoustic", fillcolor="#ffffff"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="gender <= 0.5\ngini = 0.5\nsamples = 6\nvalue = [0, 0, 3, 3, 0]\nclass = Dance", fillcolor="#ffffff"] ;
1 -> 2 ;
3 [label="gini = 0.0\nsamples = 3\nvalue = [0, 0, 3, 0, 0]\nclass = Dance", fillcolor="#39e5c5"] ;
2 -> 3 ;
4 [label="gini = 0.0\nsamples = 3\nvalue = [0, 0, 0, 3, 0]\nclass = HipHop", fillcolor="#3c39e5"] ;
2 -> 4 ;
5 [label="gender <= 0.5\ngini = 0.5\nsamples = 6\nvalue = [3, 0, 0, 0, 3]\nclass = Acoustic", fillcolor="#ffffff"] ;
1 -> 5 ;
6 [label="gini = 0.0\nsamples = 3\nvalue = [3, 0, 0, 0, 0]\nclass = Acoustic", fillcolor="#e58139"] ;
5 -> 6 ;
7 [label="gini = 0.0\nsamples = 3\nvalue = [0, 0, 0, 0, 3]\nclass = Jazz", fillcolor="#e539c0"] ;
5 -> 7 ;
8 [label="gini = 0.0\nsamples = 6\nvalue = [0, 6, 0, 0, 0]\nclass = Classical", fillcolor="#7be539"] ;
0 -> 8 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}