Skip to main content

KNN Sınıflama

KNN (K-en Yakın Komşu) sınıflama, gözetimli öğrenme algoritmaları içerisinde yer alan ve sınıflandırma ile regresyon problemlerinde kullanılan basit ama etkili bir yöntemdir. Bu yöntemde, bir öğe sınıflandırılırken, veri setindeki en yakın 'k' komşusuna bakılır ve en yaygın sınıf bu öğeye atanır.

Kütüphanelerin Kaydedilmesi

Bu kısımda, KNN sınıflama modelinin uygulanması için gerekli olan kütüphaneler yüklenir. Bu kütüphaneler arasında veri seti işleme, model eğitimi, metrik hesaplama ve veri görselleştirme için gerekenler bulunmaktadır.

import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.metrics import classification_report, accuracy_score
from scipy import stats
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.metrics import roc_curve
from sklearn.metrics import RocCurveDisplay
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import PrecisionRecallDisplay
import sklearn.metrics as metrics

Veriyi Yükleme ve Ön İzleme Adımları

Bu aşamada, modelin eğitimi için kullanılacak veri seti yüklenir ve önizleme yapılır. Wine veri seti, farklı şarap örneklerine ait kimyasal özellikleri içerir ve bu örnekleri üç farklı sınıfa ayırır.

X, y = load_wine(return_X_y=True)

Veri setinin özellikleri ve sınıfları hakkında bilgi almak için:

print("Feature shape",X.shape)
print("Class shape",y.shape)

Feature shape (178, 13)
Class shape (178,)

Veri seti anahtarlarına erişim için:

load_wine().keys()

dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'])

Tahmin edilen verilerin kategorik sınıflandırılması için:

print("Tahmin verileri kategorik sınıflandırılması:")
print(load_wine().target)

Tahmin verileri kategorik sınıflandırılması:
[0 0 0 0 0 0...2 2 2]

Veri seti hakkında detaylı bilgi için:

print("Veri seti özet bilgilendirilmesi")
print(load_wine().DESCR)

Veri seti özet bilgilendirilmesi
Wine recognition dataset... [Veri setinin detaylı açıklaması]

Özür dilerim, yanlışlık oldu. İşte düzeltilmiş halleriyle istediğiniz veriler:

Veri Ön İnceleme ve Temizleme Adımları

İlk beş satırı gözlemleyerek veri setinin yapısını ve özelliklerini inceleyebiliriz.

df_wine.head()
alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesproline
14.231.712.4315.61272.803.060.282.295.641.043.921065
13.201.782.1411.21002.652.760.261.284.381.053.401050
13.162.362.6718.61012.803.240.302.815.681.033.171185
14.371.952.5016.81133.853.490.242.187.800.863.451480
13.242.592.8721.01182.802.690.391.824.321.042.93735

Veri Setinin Son On Satırının Gözlemi

Veri setinin son on satırını incelerken, veri setinin nasıl sonlandığı hakkında bilgi ediniriz.

df_wine.tail(10)
alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesproline
13.582.582.6924.51051.550.840.391.548.660.741.80750
13.404.602.8625.01121.980.960.271.118.500.671.92630
12.203.032.3219.0961.250.490.400.735.500.661.83510
12.772.392.2819.5861.390.510.480.649.900.571.63470
14.162.512.4820.0911.680.700.441.249.700.621.71660
13.715.652.4520.5951.680.610.521.067.700.641.74740
13.403.912.4823.01021.800.750.431.417.300.701.56750
13.274.282.2620.01201.590.690.431.3510.200.591.56835
13.172.592.3720.01201.650.680.531.469.300.601.62840
14.134.102.7424.5962.050.760.561.359.200.611.60560

Eksik Değerlerin Kontrolü

Eksik değerlerin olup olmadığını kontrol ederiz, bu önemlidir çünkü eksik veriler analiz sonuçlarını etkileyebilir.

df_wine.isnull().sum()
ColumnMissing Values
alcohol0
malic_acid0
ash0
alcalinity_of_ash0
magnesium0
total_phenols0
flavanoids0
nonflavanoid_phenols0
proanthocyanins0
color_intensity0
hue0
od280/od315_of_diluted_wines0
proline0
df_wine.describe()
alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesproline
count178.000000178.000000178.000000178.000000178.000000178.000000178.000000178.000000178.000000178.000000178.000000178.000000178.000000
mean13.0006182.3363482.36651719.49494499.7415732.2951122.0292700.3618541.5908995.0580900.9574492.611685746.893258
std0.8118271.1171460.2743443.33956414.2824840.6258510.9988590.1244530.5723592.3182860.2285720.709990314.907474
min11.0300000.7400001.36000010.60000070.0000000.9800000.3400000.1300000.4100001.2800000.4800001.270000278.000000
25%12.3625001.6025002.21000017.20000088.0000001.7425001.2050000.2700001.2500003.2200000.7825001.937500500.500000
50%13.0500001.8650002.36000019.50000098.0000002.3550002.1350000.3400001.5550004.6900000.9650002.780000673.500000
75%13.6775003.0825002.55750021.500000107.0000002.8000002.8750000.4375001.9500006.2000001.1200003.170000985.000000
max14.8300005.8000003.23000030.000000162.0000003.8800005.0800000.6600003.58000013.0000001.7100004.0000001680.000000

Aykırı Değer Tespiti ve Temizlenmesi

Z-Skoru ile Aykırı Değer Tespiti:

Aykırı değerler, veri setinin genel dağılımından önemli ölçüde farklı olan veri noktalarıdır. Z-skoru yöntemi, her bir veri noktasının ortalamadan ne kadar standart sapma uzaklıkta olduğunu hesaplayarak bu aykırı değerleri belirler.

Aşağıdaki Python kodu, df_wine veri setindeki her bir özelliğin Z-skorunu hesaplar ve bu değerleri yazdırır. Ayrıca Z-skoru matrisinin boyutunu da verir.

z_score = np.abs(stats.zscore(df_wine))
print(z_score)
print("Z-skoru matrisinin boyutu:", len(z_score))

Aykırı Değerlerin Temizlenmesi:

Belirlenen eşik değerin (genellikle Z > 3) üzerindeki veri noktaları aykırı olarak kabul edilir ve bu noktalar veri setinden çıkarılır. Bu işlem, veri setini bu tür aşırı değerlerden arındırmak için yapılır.

Aşağıdaki Python kodu, aykırı değerleri tespit eder, bu değerlere sahip satırları çıkarır ve yeni veri setini new_df olarak oluşturur. Ayrıca, orijinal y etiketler dizisinden, çıkarılan satırlara karşılık gelen etiketleri de çıkararak y_new etiketler dizisini oluşturur.

outliers = list(set(np.where(z_score > 3)[0]))
new_df = df_wine.drop(outliers, axis=0).reset_index(drop=True)
display(new_df)
y_new = y[list(new_df.index)]
print("Yeni y veri setinin boyutu:", len(y_new))

Bu işlemler, veri setinden aykırı değerlerin başarıyla çıkarılmasını ve analiz veya model eğitimi için daha temiz bir veri setinin hazırlanmasını sağlar. Aykırı değerlerin çıkarılması, modelin genel performansını iyileştirebilir ve daha güvenilir sonuçlar elde edilmesine yardımcı olabilir.

indexalcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesproline
0014.231.712.4315.6127.02.803.060.282.295.641.043.921065.0
1113.201.782.1411.2100.02.652.760.261.284.381.053.401050.0
2213.162.362.6718.6101.02.803.240.302.815.681.033.171185.0
3314.371.952.5016.8113.03.853.490.242.187.800.863.451480.0
4413.242.592.8721.0118.02.802.690.391.824.321.042.93735.0
.............................................
16317313.715.652.4520.595.01.680.610.521.067.700.641.74740.0
16417413.403.912.4823.0102.01.800.750.431.417.300.701.56750.0
16517513.274.282.2620.0120.01.590.690.431.3510.200.591.56835.0
16617613.172.592.3720.0120.01.650.680.531.469.300.601.62840.0
16717714.134.102.7424.596.02.050.760.561.359.200.611.60560.0

Aykırı Değerlerin Çıkarılmasının Sonuçları

Aşağıdaki adımlar ve kodlar, aykırı değerlerin tespiti ve temizlenmesi sürecinin sonuçlarını göstermektedir:

  1. Aykırı Değerlerin Tespiti ve Çıkarılması:

    Aykırı değerlerin çıkarılmasının ardından, veri setinden çıkarılan satır sayısını gösteren bir çıktı:

    print("Outlier değer içeren veri sayısı", len(df_wine) - len(new_df))

    Bu, veri setinden çıkarılan aykırı değer içeren satır sayısını verir. Örneğin:

    Outlier değer içeren veri sayısı 10

    Bu örnekte, veri setinden 10 satırın aykırı değerler nedeniyle çıkarıldığı belirtilmiştir.

  2. Yeni Veri Setinin Oluşturulması:

    Aykırı değerler çıkarıldıktan sonra, aykırı olmayan verilerle yeni bir veri seti oluşturulur. Bu, modelleme veya daha fazla analiz için temiz bir başlangıç noktası sağlar:

    X_wine = new_df.drop("index", axis=1)

    Bu işlem, aykırı değerler çıkarıldıktan sonra yeni oluşturulan veri setinden 'index' sütununun çıkarılmasını sağlar.

  3. Yeni Veri Setinin Boyutunun Kontrolü:

    Yeni veri setinin boyutunu kontrol etmek için:

    print(len(X_wine))

    Bu, yeni veri setinin satır sayısını verir. Örneğin:

    168

    Bu örnekte, yeni veri setinin 168 satır içerdiği belirtilmiştir, bu da orijinal veri setinden 10 satırın çıkarıldığını gösterir.

  4. Yeni Veri Setinin İlk Beş Satırının Gösterilmesi:

    Yeni veri setinin ilk beş satırını görmek için:

    X_wine.head()

    Bu kod, temizlenmiş ve aykırı değerlerden arındırılmış yeni veri setinin ilk beş satırını gösterir. Bu, veri ön işlemenin nasıl gerçekleştiğini ve veri setinin son durumunu anlamak için yararlıdır.

alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesproline
014.231.712.4315.6127.02.803.060.282.295.641.043.921065.0
113.201.782.1411.2100.02.652.760.261.284.381.053.401050.0
213.162.362.6718.6101.02.803.240.302.815.681.033.171185.0
314.371.952.5016.8113.03.853.490.242.187.800.863.451480.0
413.242.592.8721.0118.02.802.690.391.824.321.042.93735.0

Veride özellikle "Magnesium" ve "proline" değerlerinin veride çok aykırı olarak yüksek olduğu görülmektedir. Bu yüzden veride bir standartize etme adımı gerçekleştirilecektir!!!!!!

Normalize Edilmiş Verilerin İncelenmesi

Veri setindeki özelliklerin ölçeklendirilmesi, makine öğrenimi algoritmalarının daha iyi performans göstermesine yardımcı olabilir. Özellikle, birçok algoritma, tüm özelliklerin aynı ölçekte olmasını gerektirir. Bu nedenle, StandardScaler kullanılarak veri setinin özelliklerini ölçeklendirme işlemi gerçekleştirilmiştir.

Verilerin Standartlaştırılması:

StandardScaler kullanarak X_wine veri setinin tüm özelliklerini standartlaştırdık:

X_std = StandardScaler().fit_transform(X_wine)

Bu işlem, her bir özelliğin ortalamasını 0 ve standart sapmasını 1 olacak şekilde ayarlar.

Normalize Edilmiş Verilerin İncelenmesi:

Standartlaştırılmış verileri, anlaşılır bir formatta incelemek için pandas DataFrame'ine dönüştürdük:

df_onizleme = pd.DataFrame(X_std, columns=load_wine().feature_names)
df_onizleme.head()

Bu kod, standartlaştırılmış veri setinin ilk beş satırını gösterir. Burada, her bir özelliğin yeni değerlerinin nasıl dağıldığını ve standartlaştırma sonucunda elde edilen değerlerin özellikler arası karşılaştırılabilir hale nasıl getirildiğini görebiliriz.

Bu aşama, veri ön işleme sürecinin önemli bir parçasıdır ve makine öğrenimi modellerinin eğitimi için veri setini hazırlar.

alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesproline
01.513539-0.5788420.250637-1.2096532.2534660.8402501.068668-0.6690811.3955650.2339620.4037661.8574530.980537
10.210929-0.514888-0.945351-2.6247110.0974390.6006400.763248-0.830933-0.517348-0.3293980.4492491.1276050.933414
20.1603420.0150091.240421-0.2448400.1772920.8402501.251920-0.5072302.3804320.2518460.3582840.8047881.357515
31.690593-0.3595740.539324-0.8237281.1355262.5175171.506437-0.9927841.1872281.199721-0.4149201.1977832.284254
40.2615160.2251412.0652400.5270101.5347900.8402500.6919830.2211000.505398-0.3562250.4037660.467935-0.056154

Model Oluşturma İşlemleri

Bu bölümde, K-En Yakın Komşu (KNN) algoritması kullanılarak bir sınıflandırma modeli oluşturulmuştur. Ayrıca, modelin performansını artırmak için en uygun parametreler GridSearchCV kullanılarak belirlenmiştir.

Train_Test_Split

Veri seti, eğitim ve test olmak üzere iki bölüme ayrıldı. Bu bölme işlemi, modelin eğitiminde kullanılacak verileri ve modelin test edilmesinde kullanılacak verileri ayırmak için yapıldı.

X_train, X_test, y_train, y_test = train_test_split(X_std, y_new, test_size=0.3, random_state=42)

Eğitim ve test veri setlerinin boyutları:

  • Eğitim verisi: 117 örnek, 13 özellik
  • Test verisi: 51 örnek, 13 özellik

Grid Search ile En Uygun Parametrelerin Belirlenmesi

GridSearchCV kullanılarak KNN modeli için en uygun parametreler aranmıştır. Bu parametreler, modelin performansını maksimize etmek için önemlidir.

grid = {"weights": ["distance", "uniform"],
"algorithm": ["auto", "ball_tree", "kd_tree"],
"metric": ["manhattan", "chebyshev", "minkowski", "mahalanobis"],
"n_neighbors": np.arange(4, 10, 1)}

knn_cv = GridSearchCV(KNeighborsClassifier(), grid, cv=15)
knn_cv.fit(X_train, y_train)

En Uygun Parametreler

GridSearchCV sonucunda elde edilen en iyi parametreler ve skor:

  • En iyi parametreler: {'algorithm': 'auto', 'metric': 'manhattan', 'n_neighbors': 4, 'weights': 'distance'}
  • En iyi skor: 1.0

Default k Değeri ve En Uygun Parametreler ile KNN Modeli

Model, en uygun parametreler ile eğitilmiş ve eğitim ile test veri setleri üzerinde doğruluk skorları hesaplanmıştır:

  • Eğitim seti doğruluk skoru: 1.0
  • Test seti doğruluk skoru: 0.9607843137254902

Bu skorlar, modelin eğitim veri setine mükemmel şekilde uyduğunu ve test veri setinde de yüksek performans gösterdiğini belirtir.

Karışıklık Matrisi

Modelin performansını daha iyi anlamak için karışıklık matrisi kullanılmıştır. Bu matris, modelin her sınıf için doğru ve yanlış tahminlerini gösterir. Örneğin, (0,1) ve (2,1) hücrelerindeki değerler, modelin bu sınıflarda yaptığı hatalı tahminlerin sayısını belirtir.

En Uygun K Değerinin Belirlenmesi

Modelin performansını farklı k değerleri için değerlendirerek en uygun k değerinin bulunması işlemi gerçekleştirilmiştir. Bu işlem, farklı k değerleri için ortalama hata oranlarının hesaplanmasını içerir ve en düşük hata oranına sahip k değeri, model için en uygun k değeri olarak seçilir. Bu örnekte, en düşük hata oranını veren k değeri 8 olarak belirlenmiştir.

En Uygun k Değeri ve Parametreler ile Modelin Oluşturulması

Bu bölümde, K-En Yakın Komşu sınıflandırma algoritması kullanılarak bir model oluşturulmaktadır. Seçilen parametrelerle model eğitilmiş ve test edilmiştir.

Model, 8 komşu kullanarak, 'manhattan' metriğini ve 'distance' ağırlıklandırmasını temel alarak oluşturulmuştur:

model1 = KNeighborsClassifier(n_neighbors = 8, algorithm = "auto", metric="manhattan", weights = "distance")
model1.fit(X_train, y_train)

KNeighborsClassifier(metric='manhattan', n_neighbors=8, weights='distance')

Modelin eğitim ve test setlerindeki doğruluk skorları aşağıdaki gibidir:

print("Train set doğruluk skoru", model1.score(X_train, y_train))
print("Test set doğruluk skoru", model1.score(X_test, y_test))

Train set doğruluk skoru 1.0
Test set doğruluk skoru 0.9803921568627451

En uygun k değeri kullanılarak, modelin performansı iyileştirilmiş ve daha önceki modelden farklı olarak yanlış tahminler azaltılmıştır.

Modelin sınıflandırma performansını değerlendirmek için oluşturulan karmaşıklık matrisi aşağıdaki gibidir:

y_pred = model1.predict(X_test)
con_matrix = confusion_matrix(y_test, y_pred)
con_matrix_display = ConfusionMatrixDisplay(con_matrix).plot()

png

Model Doğruluk Parametrelerinin Belirlenmesi

Bu bölümde, modelin çeşitli doğruluk parametreleri üzerinden değerlendirilmesi yapılmaktadır:

print(classification_report(y_test, y_pred))
print("Model Accuracy", accuracy_score(y_test, y_pred))

Bu raporda modelin kesinlik, geri çağırma ve F1 skoru gibi önemli performans göstergeleri yer almaktadır. Model genel olarak yüksek bir doğrulukla sınıflandırma yapmaktadır.

ROC-AUC Eğrisi

Modelin ROC-AUC eğrisi, sınıflandırıcının çeşitli eşik değerlerdeki performansını göstermektedir. ROC eğrisi, modelin duyarlılık (gerçek pozitif oranı) ve 1 - spesifisite (yanlış pozitif oranı) arasındaki ilişkiyi gösterir:

fpr, tpr, _ = roc_curve(y_test, y_pred, pos_label=2)
roc_display = RocCurveDisplay(fpr=fpr, tpr=tpr).plot()

png

Precision Recall Eğrisi

Precision-Recall eğrisi, modelin farklı kesik noktalarındaki kesinlik ve geri çağırma değerlerini gösterir. Bu, özellikle dengesiz veri setlerinde kullanışlı bir metriktir:

prec, recall, _ = precision_recall_curve(y_test, y_pred, pos_label=2)
pr_display = PrecisionRecallDisplay(precision=prec, recall=recall).plot()

png

Veri Yükleme ve İlk Bakış

Bu bölümde, veri seti Python'a yüklenir ve veri setinin bir ön izlemesi yapılır:

import pandas as pd
data = pd.read_csv("./mxmh_survey_results.csv")
df = pd.DataFrame(data)

Veri setinin ilk beş satırını göstermek için kullanılır:

df.head(5)
TimestampAgePrimary streaming serviceHours per dayWhile workingInstrumentalistComposerFav genreExploratoryForeign languages...Frequency [R&B]Frequency [Rap]Frequency [Rock]Frequency [Video game music]AnxietyDepressionInsomniaOCDMusic effectsPermissions
08/27/2022 19:29:0218.0Spotify3.0YesYesYesLatinYesYes...SometimesVery frequentlyNeverSometimes3.00.01.00.0NaNI understand.
18/27/2022 19:57:3163.0Pandora1.5YesNoNoRockYesNo...SometimesRarelyVery frequentlyRarely7.02.02.01.0NaNI understand.
28/27/2022 21:28:1818.0Spotify4.0NoNoNoVideo game musicNoYes...NeverRarelyRarelyVery frequently7.07.010.02.0No effectI understand.
38/27/2022 21:40:4061.0YouTube Music2.5YesNoYesJazzYesYes...SometimesNeverNeverNever9.07.03.03.0ImproveI understand.
48/27/2022 21:54:4718.0Spotify4.0YesNoNoR&BYesNo...Very frequentlyVery frequentlyNeverRarely7.02.05.09.0ImproveI understand.

Bu bölümde, veri seti üzerinde çeşitli veri ön işleme adımları gerçekleştirilmektedir. Bu işlemler, veri setinin daha iyi anlaşılmasını ve modelleme aşaması için hazır hale getirilmesini sağlar.

Veri setinin sütunları ve veri türleri hakkında bilgi edinmek için aşağıdaki kod blokları kullanılır:

df.columns

Bu kod, veri setindeki tüm sütun isimlerini listeler.

df.info()

Bu kod, her bir sütun hakkında detaylı bilgi sağlar, örneğin sütunun veri türü ve kaç tane non-null değeri olduğu.

df.isnull().sum()

Bu kod, veri setindeki her bir sütun için eksik değerlerin (null) toplam sayısını hesaplar.

Veri setinden gereksiz veya istenmeyen sütunların çıkarılması için aşağıdaki kod kullanılır:

df = df.drop(["Timestamp", "BPM"], axis=1)

Bu kod, 'Timestamp' ve 'BPM' sütunlarını veri setinden çıkarır.

Veri setindeki kategorik değişkenleri belirlemek ve bunların listesini almak için aşağıdaki kod blokları kullanılır:

categorical = [var for var in df.columns if df[var].dtype == 'O']

print('There are {} categorical variables\n'.format(len(categorical)))

print('The categorical variables are :\n\n', categorical)

Bu kodlar, veri türü 'object' (yani kategorik) olan sütunları tespit eder ve bunları listeler.

Kategorik değişkenlerin ilk beş satırını görmek için aşağıdaki kod kullanılır:

df[categorical].head()

Bu kod, kategorik değişkenlerin ilk beş gözlemini gösterir, böylece bu değişkenlerin değerleri hakkında hızlıca bilgi edinilebilir.

Primary streaming serviceWhile workingInstrumentalistComposerFav genreExploratoryForeign languagesFrequency [Classical]Frequency [Country]Frequency [EDM]...Frequency [Latin]Frequency [Lofi]Frequency [Metal]Frequency [Pop]Frequency [R&B]Frequency [Rap]Frequency [Rock]Frequency [Video game music]Music effectsPermissions
0SpotifyYesYesYesLatinYesYesRarelyNeverRarely...Very frequentlyRarelyNeverVery frequentlySometimesVery frequentlyNeverSometimesNaNI understand.
1PandoraYesNoNoRockYesNoSometimesNeverNever...SometimesRarelyNeverSometimesSometimesRarelyVery frequentlyRarelyNaNI understand.
2SpotifyNoNoNoVideo game musicNoYesNeverNeverVery frequently...NeverSometimesSometimesRarelyNeverRarelyRarelyVery frequentlyNo effectI understand.
3YouTube MusicYesNoYesJazzYesYesSometimesNeverNever...Very frequentlySometimesNeverSometimesSometimesNeverNeverNeverImproveI understand.
4SpotifyYesNoNoR&BYesNoNeverNeverRarely...SometimesSometimesNeverSometimesVery frequentlyVery frequentlyNeverRarelyImproveI understand.
df[categorical].isnull().sum()

Kategorik veriler incelendiğinde genellikle yes-no soruları ve "Never, Rarely, Sometimes, Very frequently" ile müzik çeşitlerinin dinlenme frekans dağılımları verilmiştir.

for var in categorical:
print("*"*25)
print(var)
print("-"*25)
print(df[var].value_counts())
for var in categorical:
print(var, ' İçerir ', len(df[var].unique()), ' etiketleri')
df["Primary streaming service"].value_counts()

En fazla ve farklı etikete sahip grup. Veri setinden çıkarabilirim çünkü spotify biraz baskın gözüküyor.

clear_categ = []
for col in categorical:
if df[col].isnull().mean()>0:
clear_categ.append(col)
print(col, (df[col].isnull().mean()))
print(clear_categ)
for i in clear_categ:
df[i].fillna(df[i].mode()[0],inplace=True)

O özelliğin ortalama değeri ile NaN değerlerin yerini doldurduk

df[categorical].isnull().sum()
df[categorical].head(5)
Primary streaming serviceWhile workingInstrumentalistComposerFav genreExploratoryForeign languagesFrequency [Classical]Frequency [Country]Frequency [EDM]...Frequency [Latin]Frequency [Lofi]Frequency [Metal]Frequency [Pop]Frequency [R&B]Frequency [Rap]Frequency [Rock]Frequency [Video game music]Music effectsPermissions
0SpotifyYesYesYesLatinYesYesRarelyNeverRarely...Very frequentlyRarelyNeverVery frequentlySometimesVery frequentlyNeverSometimesImproveI understand.
1PandoraYesNoNoRockYesNoSometimesNeverNever...SometimesRarelyNeverSometimesSometimesRarelyVery frequentlyRarelyImproveI understand.
2SpotifyNoNoNoVideo game musicNoYesNeverNeverVery frequently...NeverSometimesSometimesRarelyNeverRarelyRarelyVery frequentlyNo effectI understand.
3YouTube MusicYesNoYesJazzYesYesSometimesNeverNever...Very frequentlySometimesNeverSometimesSometimesNeverNeverNeverImproveI understand.
4SpotifyYesNoNoR&BYesNoNeverNeverRarely...SometimesSometimesNeverSometimesVery frequentlyVery frequentlyNeverRarelyImproveI understand.

Bu bölümde, veri setindeki nümerik değişkenlerin işlenmesi ve kategorik değişkenlerin kodlanması işlemleri gerçekleştirilmektedir.

Öncelikle veri setindeki nümerik değişkenler belirlenir:

numerical = [var for var in df.columns if df[var].dtype != 'O']

print('-{}- Adet nümerik değişken vardır\n'.format(len(numerical)))

print('Bu Nümerik veriler :', numerical)

-6- Adet nümerik değişken vardır
Bu Nümerik veriler : ['Age', 'Hours per day', 'Anxiety', 'Depression', 'Insomnia', 'OCD']

Nümerik değişkenlerin ilk beş satırı gösterilmiştir ve her biri farklı psikolojik ve yaşam tarzı ölçütlerini temsil etmektedir.

Daha sonra, bu nümerik değişkenler içinde eksik değerlerin olup olmadığı kontrol edilir:

df[numerical].isnull().sum()

Sadece 'Age' sütununda bir eksik değer bulunduğu belirlenmiş ve bu değer, yaş ortalaması ile doldurulmuştur:

df["Age"].fillna(int(df["Age"].mean()), inplace=True)

Böylece, tüm nümerik değişkenlerde eksik değer kalmamıştır:

df[numerical].isnull().sum()

Ardından, 'Fav genre' yani en sevilen müzik türüne ilişkin benzersiz değerler incelenmiştir:

df["Fav genre"].unique()

Bu, çeşitli müzik türlerini içeren bir sütundur.

Daha sonra, bağımsız değişkenler (X) ve bağımlı değişken (Y) olarak ayrılır:

X, Y = df.drop(["Fav genre"], axis=1), df["Fav genre"]

Kategorik değişkenler, makine öğrenimi modellerinde kullanılmak üzere sayısal değerlere dönüştürülmektedir:

import category_encoders as ce

categorical = [var for var in df.columns if df[var].dtype == 'O']
categorical.remove("Fav genre")

encoder = ce.OrdinalEncoder(cols=categorical)
X = encoder.fit_transform(X)

Bu işlemler sonrasında, veri seti modelleme aşaması için hazır hale gelmiştir ve X kısmı, kategorik değişkenlerin kodlanmış haliyle güncellenmiştir:

X.head()
AgePrimary streaming serviceHours per dayWhile workingInstrumentalistComposerExploratoryForeign languagesFrequency [Classical]Frequency [Country]...Frequency [R&B]Frequency [Rap]Frequency [Rock]Frequency [Video game music]AnxietyDepressionInsomniaOCDMusic effectsPermissions
018.013.01111111...11113.00.01.00.011
163.021.51221221...12227.02.02.01.011
218.014.02222131...22337.07.010.02.021
361.032.51211121...13149.07.03.03.011
418.014.01221231...31127.02.05.09.011

Bu bölümde, veri seti üzerinde bir sınıflandırma modeli oluşturulmuş ve bu modelin performansı değerlendirilmiştir.

Öncelikle, bağımsız değişkenlerin ölçeklendirilmesi işlemi gerçekleştirilmiştir:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)

Bu, veri setindeki tüm nümerik değişkenlerin standart bir ölçeğe dönüştürülmesini sağlar, böylece model daha iyi bir performans gösterebilir.

Y.head() kullanılarak bağımlı değişkenin (müzik türleri) ilk beş değeri gösterilmiştir:

0               Latin
1 Rock
2 Video game music
3 Jazz
4 R&B
Name: Fav genre, dtype: object

Veri seti, modelin eğitilmesi ve test edilmesi için eğitim ve test setlerine ayrılmıştır:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=0, stratify=Y)

Model olarak Gaussian Naive Bayes kullanılmış ve eğitim seti üzerinde eğitilmiştir:

from sklearn.naive_bayes import GaussianNB

gnb = GaussianNB()
gnb.fit(X_train, y_train)

Modelin test seti üzerindeki tahminleri ve doğruluk puanı aşağıdaki gibidir:

y_pred = gnb.predict(X_test)
from sklearn.metrics import accuracy_score

print('Model accuracy score: {0:0.4f}'.format(accuracy_score(y_test, y_pred)))

Model accuracy score: 0.4615

Bu, modelin %46.15 doğrulukla tahmin yaptığını gösterir.

Ayrıca, modelin çapraz doğrulama skorları da hesaplanmıştır:

from sklearn.model_selection import cross_val_score

cross_val_score(gnb, X_train, y_train, scoring='accuracy', cv=10)

Karmaşıklık matrisi ile modelin performansının detaylı analizi yapılmıştır:

import seaborn as sns
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score, roc_curve, roc_auc_score
import matplotlib.pyplot as plt
import numpy as np

y_pred = gnb.predict(X_test)
conf_mat = confusion_matrix(y_test, y_pred)
classes = Y.unique()
f, ax = plt.subplots(figsize=(15, 15))
sns.heatmap(conf_mat, annot=True, fmt='.0f')
ax.set_xticklabels(classes)
ax.set_yticklabels(classes)
plt.show()

png

Bu matris, farklı müzik türleri arasında modelin nasıl performans gösterdiğini gösterir.

Son olarak, modelin sınıflandırma raporu incelenmiştir:

classification_report = classification_report(y_test, y_pred)
print(classification_report)

Bu rapor, modelin her bir sınıf için kesinlik, geri çağırma ve F1 skoru gibi metriklerini içerir. Bu değerler, modelin her bir müzik türüne ne kadar iyi tahmin yaptığını gösterir.