Principal Component Analysis

Kategori: Machine Learning , 01 Ocak 2020 , JanFranco


Bu yazımda Principal Components Analysis veya kısa adıyla PCA algoritmasını göreceğiz. Algoritmanın mantığını ve Python'da kodlanmasını anlatacağım. Arkasındaki matematiği bir başka yazıda anlatmayı düşünüyorum. PCA, bir boyut indirgeme uygulamasıdır. Boyuttan kastım tabi ki attribute'lar. Bir verisetinde yüzlerce attribute bulunabilir. Bunları boyut indirgeyerek azaltabiliriz. Bunu en iyi şarap örneği ile anlatabilirim:

Principal component analysis

Yukarıdaki resimde 10 farklı şarap görüyoruz. Her birinin bir çok özelliği bulunuyor. Ben şarap uzmanı olmadığımdan çok bir fikrim yok ama asitlik, alkol oranı vs. gibi özelliklerini tek bir boyuta indirgeyebiliriz. Burada bu boyut renk boyutudur. Burada her bir şarabın özelliklerini tek tek söylemek yerine sadece rengini söylersek aslında o şarabı tarif etmiş oluruz. İşte PCA algoritması da tam olarak budur. Peki bu tam olarak nasıl yapılıyor? Şimdi elimizde bir veri seti olsun. Bu verisetinde iki attribute kullanarak aşağıdaki gibi bir scatter grafik çizdiğimizi düşünelim:

Principal component analysis

Burada x ve y eksenlerini kaydırarak boyut indirgeyebiliriz. Aşağıdaki görselde kırmızı noktaların bağlı olduğu siyah eksen yeni bir boyuttur:

Principal component analysis

Optimum boyut ise sağda ve solda çapraz bir şekilde çizilmiş pembe-mor karışımı renkteki çizgilerin olduğu yerdir. Yani siyah eksenimiz bu çizgilerin hizasına geldiğinde optimum boyut elde edilmiş olur. Burada bu boyut eigenvalue ve eigenvectorler ile bulunuyor. Dediğim gibi arkasındaki matematiği bir başka yazıda anlatacağım. Python ile kodlanmasına geçmeden önce belirteyim, burada yapılan işlem sonuçta bir boyut azaltma işlemi. Bu işlemde veri kayıpları olabilir, olmayadabilir. Başarı artadabilir, azaladabilir. Kütüphaneyi ve verileri import edelim:


import pandas as pd
from sklearn.decomposition import PCA
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)

df = pd.read_csv('Wine.csv')
print(df)

>>

     Alcohol  Malic_Acid   Ash  Ash_Alcanity  Magnesium  Total_Phenols  Flavanoids  Nonflavanoid_Phenols  Proanthocyanins  Color_Intensity   Hue  OD280  Proline  Customer_Segment
0      14.23        1.71  2.43          15.6        127           2.80        3.06                  0.28             2.29         5.640000  1.04   3.92     1065                 1
1      13.20        1.78  2.14          11.2        100           2.65        2.76                  0.26             1.28         4.380000  1.05   3.40     1050                 1
2      13.16        2.36  2.67          18.6        101           2.80        3.24                  0.30             2.81         5.680000  1.03   3.17     1185                 1
3      14.37        1.95  2.50          16.8        113           3.85        3.49                  0.24             2.18         7.800000  0.86   3.45     1480                 1
4      13.24        2.59  2.87          21.0        118           2.80        2.69                  0.39             1.82         4.320000  1.04   2.93      735                 1
5      14.20        1.76  2.45          15.2        112           3.27        3.39                  0.34             1.97         6.750000  1.05   2.85     1450                 1
6      14.39        1.87  2.45          14.6         96           2.50        2.52                  0.30             1.98         5.250000  1.02   3.58     1290                 1
7      14.06        2.15  2.61          17.6        121           2.60        2.51                  0.31             1.25         5.050000  1.06   3.58     1295                 1
8      14.83        1.64  2.17          14.0         97           2.80        2.98                  0.29             1.98         5.200000  1.08   2.85     1045                 1
9      13.86        1.35  2.27          16.0         98           2.98        3.15                  0.22             1.85         7.220000  1.01   3.55     1045                 1
10     14.10        2.16  2.30          18.0        105           2.95        3.32                  0.22             2.38         5.750000  1.25   3.17     1510                 1
11     14.12        1.48  2.32          16.8         95           2.20        2.43                  0.26             1.57         5.000000  1.17   2.82     1280                 1
12     13.75        1.73  2.41          16.0         89           2.60        2.76                  0.29             1.81         5.600000  1.15   2.90     1320                 1
13     14.75        1.73  2.39          11.4         91           3.10        3.69                  0.43             2.81         5.400000  1.25   2.73     1150                 1
14     14.38        1.87  2.38          12.0        102           3.30        3.64                  0.29             2.96         7.500000  1.20   3.00     1547                 1
15     13.63        1.81  2.70          17.2        112           2.85        2.91                  0.30             1.46         7.300000  1.28   2.88     1310                 1
16     14.30        1.92  2.72          20.0        120           2.80        3.14                  0.33             1.97         6.200000  1.07   2.65     1280                 1
17     13.83        1.57  2.62          20.0        115           2.95        3.40                  0.40             1.72         6.600000  1.13   2.57     1130                 1
18     14.19        1.59  2.48          16.5        108           3.30        3.93                  0.32             1.86         8.700000  1.23   2.82     1680                 1
19     13.64        3.10  2.56          15.2        116           2.70        3.03                  0.17             1.66         5.100000  0.96   3.36      845                 1
20     14.06        1.63  2.28          16.0        126           3.00        3.17                  0.24             2.10         5.650000  1.09   3.71      780                 1
21     12.93        3.80  2.65          18.6        102           2.41        2.41                  0.25             1.98         4.500000  1.03   3.52      770                 1
22     13.71        1.86  2.36          16.6        101           2.61        2.88                  0.27             1.69         3.800000  1.11   4.00     1035                 1
23     12.85        1.60  2.52          17.8         95           2.48        2.37                  0.26             1.46         3.930000  1.09   3.63     1015                 1
24     13.50        1.81  2.61          20.0         96           2.53        2.61                  0.28             1.66         3.520000  1.12   3.82      845                 1
25     13.05        2.05  3.22          25.0        124           2.63        2.68                  0.47             1.92         3.580000  1.13   3.20      830                 1
26     13.39        1.77  2.62          16.1         93           2.85        2.94                  0.34             1.45         4.800000  0.92   3.22     1195                 1
27     13.30        1.72  2.14          17.0         94           2.40        2.19                  0.27             1.35         3.950000  1.02   2.77     1285                 1
28     13.87        1.90  2.80          19.4        107           2.95        2.97                  0.37             1.76         4.500000  1.25   3.40      915                 1
29     14.02        1.68  2.21          16.0         96           2.65        2.33                  0.26             1.98         4.700000  1.04   3.59     1035                 1
..       ...         ...   ...           ...        ...            ...         ...                   ...              ...              ...   ...    ...      ...               ...
148    13.32        3.24  2.38          21.5         92           1.93        0.76                  0.45             1.25         8.420000  0.55   1.62      650                 3
149    13.08        3.90  2.36          21.5        113           1.41        1.39                  0.34             1.14         9.400000  0.57   1.33      550                 3
150    13.50        3.12  2.62          24.0        123           1.40        1.57                  0.22             1.25         8.600000  0.59   1.30      500                 3
151    12.79        2.67  2.48          22.0        112           1.48        1.36                  0.24             1.26        10.800000  0.48   1.47      480                 3
152    13.11        1.90  2.75          25.5        116           2.20        1.28                  0.26             1.56         7.100000  0.61   1.33      425                 3
153    13.23        3.30  2.28          18.5         98           1.80        0.83                  0.61             1.87        10.520000  0.56   1.51      675                 3
154    12.58        1.29  2.10          20.0        103           1.48        0.58                  0.53             1.40         7.600000  0.58   1.55      640                 3
155    13.17        5.19  2.32          22.0         93           1.74        0.63                  0.61             1.55         7.900000  0.60   1.48      725                 3
156    13.84        4.12  2.38          19.5         89           1.80        0.83                  0.48             1.56         9.010000  0.57   1.64      480                 3
157    12.45        3.03  2.64          27.0         97           1.90        0.58                  0.63             1.14         7.500000  0.67   1.73      880                 3
158    14.34        1.68  2.70          25.0         98           2.80        1.31                  0.53             2.70        13.000000  0.57   1.96      660                 3
159    13.48        1.67  2.64          22.5         89           2.60        1.10                  0.52             2.29        11.750000  0.57   1.78      620                 3
160    12.36        3.83  2.38          21.0         88           2.30        0.92                  0.50             1.04         7.650000  0.56   1.58      520                 3
161    13.69        3.26  2.54          20.0        107           1.83        0.56                  0.50             0.80         5.880000  0.96   1.82      680                 3
162    12.85        3.27  2.58          22.0        106           1.65        0.60                  0.60             0.96         5.580000  0.87   2.11      570                 3
163    12.96        3.45  2.35          18.5        106           1.39        0.70                  0.40             0.94         5.280000  0.68   1.75      675                 3
164    13.78        2.76  2.30          22.0         90           1.35        0.68                  0.41             1.03         9.580000  0.70   1.68      615                 3
165    13.73        4.36  2.26          22.5         88           1.28        0.47                  0.52             1.15         6.620000  0.78   1.75      520                 3
166    13.45        3.70  2.60          23.0        111           1.70        0.92                  0.43             1.46        10.680000  0.85   1.56      695                 3
167    12.82        3.37  2.30          19.5         88           1.48        0.66                  0.40             0.97        10.260000  0.72   1.75      685                 3
168    13.58        2.58  2.69          24.5        105           1.55        0.84                  0.39             1.54         8.660000  0.74   1.80      750                 3
169    13.40        4.60  2.86          25.0        112           1.98        0.96                  0.27             1.11         8.500000  0.67   1.92      630                 3
170    12.20        3.03  2.32          19.0         96           1.25        0.49                  0.40             0.73         5.500000  0.66   1.83      510                 3
171    12.77        2.39  2.28          19.5         86           1.39        0.51                  0.48             0.64         9.899999  0.57   1.63      470                 3
172    14.16        2.51  2.48          20.0         91           1.68        0.70                  0.44             1.24         9.700000  0.62   1.71      660                 3
173    13.71        5.65  2.45          20.5         95           1.68        0.61                  0.52             1.06         7.700000  0.64   1.74      740                 3
174    13.40        3.91  2.48          23.0        102           1.80        0.75                  0.43             1.41         7.300000  0.70   1.56      750                 3
175    13.27        4.28  2.26          20.0        120           1.59        0.69                  0.43             1.35        10.200000  0.59   1.56      835                 3
176    13.17        2.59  2.37          20.0        120           1.65        0.68                  0.53             1.46         9.300000  0.60   1.62      840                 3
177    14.13        4.10  2.74          24.5         96           2.05        0.76                  0.56             1.35         9.200000  0.61   1.60      560                 3
Burada tüm sütunları kullanacağız. Son sütun olan customer_segment sütununu ise bağımlı değişken olarak kullanacağız:


x = df.iloc[:, 0:13].values
y = df.iloc[:, 13].values
Şimdi veri kümesini, train ve test şeklinde bölelim ve verileri scale edelim:


sc = StandardScaler()
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=.33, random_state=0)
x_train = sc.fit_transform(x_train)
x_test = sc.fit_transform(x_test)
Şimdi PCA sınıfından bir obje oluşturalım. Burada 13 boyutu 2 boyuta indirgeyeceğiz:


pca = PCA(n_components=2)
x_train2 = pca.fit_transform(x_train)
x_test2 = pca.transform(x_test)
2 farklı Logistic Regression modeli kuralım. Önceki veriler ile yeni oluşturduğumuz veriler ile modelleri eğitelim:


logisticReg = LogisticRegression(random_state=0)
logisticReg.fit(x_train, y_train)
res = logisticReg.predict(x_test)

logisticReg2 = LogisticRegression(random_state=0)
logisticReg2.fit(x_train2, y_train)
res2 = logisticReg2.predict(x_test2)
Sonuçları görelim:


cm1 = confusion_matrix(res, y_test)
cm2 = confusion_matrix(res2, y_test)
print(cm1)
print(cm2)

>>

[[20  0  0]
 [ 0 24  0]
 [ 0  0 15]]
[[20  1  0]
 [ 0 23  0]
 [ 0  0 15]]


Sonraki Yazı: Linear Discriminant Analysis
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın