close_btn
조회 수 94 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print

PCA_Q1. mypca.py


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import numpy as np
import numpy.linalg as lin
from sklearn.preprocessing import StandardScaler
 
 
class mypca(object):
    '''
    k : component 수
    n : 원래 차원
    components : 고유벡터 저장소 shape (k,n)
    explain_values : 고유값 shape (k,)
    '''
    
    k = None
    components = None
    explain_values= None
    
    def __init__(self, k=None, X_train=None):
        '''
        k의 값이 initial에 없으면 None으로 유지
        '''
        if k is not None :
            self.k = k       
        if X_train is not None:
            self.fit(X_train)
            
    def fit(self,X_train=None):
        if X_train is None:
            print('Input is nothing!')
            return
        if self.k is None:
            self.k = min(X_train.shape[0],X_train.shape[1])
            
        #############################################
        # TO DO                                     #
        # 인풋 데이터의 공분산행렬을 이용해         #
        # components와 explain_values 완성          # 
        #############################################
        
        cov = np.cov(X_train.T) 
        explain_values_raw, components_raw = lin.eig(cov) 
        self.explain_values = explain_values_raw[:self.k] 
        self.components = components_raw.T[:self.k]
        
        '''
        cov = data의 공분산 행렬
        explain_values_raw = 공분산 행렬의 고유값 리스트
        components_raw = 공분산 행렬의 고유벡터 행렬
        explain_values = 줄이고 싶은 차원수 만큼 슬라이싱한 고유값 리스트
        components = 줄이고 싶은 차원수 만큼 슬라이싱한 고유벡터 행렬
        '''
        
        
        #############################################
        # END CODE                                  #
        #############################################
        
        return
    
    def transform(self,X=None):
        if X is None:
            print('Input is nothing!')
            return
        
        result = None
        '''
        N : X의 행 수
        result의 shape : (N, k)
        '''
        #############################################
        # TO DO                                     #
        # components를 이용해 변환결과인            #
        # result 계산                               #
        #############################################
        
        result = np.dot(X, self.components.T)
        
        '''
        result = N차원의 data에 k개의 고유벡터를 행렬곱하여 새로운 k차원의 데이터를 만듬
        '''
        
        #############################################
        # END CODE                                  #
        #############################################       
        return result
    
    def fit_transform(self,X=None):
        if X is None:
            print('Input is nothing!')
            return
        self.fit(X)
        return self.transform(X)
cs


PCA_Q2


1
2
3
4
5
6
7
8
9
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import time
 
txt = pd.read_csv('word_embedding.csv')


original data standardization


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## 데이터 scaling 후 kmeans로 군집화
 
= StandardScaler().fit_transform(txt.iloc[:,1:])
 
kmeans = KMeans(n_clusters=10, random_state=0).fit(x)
 
lab =kmeans.labels_
## 원시 100차원 데이터로 시각화
 
import matplotlib.pyplot as plt
fig = plt.figure(figsize = (10,10))
ax = fig.add_subplot(1,1,1
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component raw_data', fontsize = 20)
 
# 군집별로 scatter 그림면 이쁜 색으로 그려짐
for i in range(10):
    ax.scatter(x[lab==i,0]
            ,x[lab==i,1]
            , s = 10)
 
ax.legend(range(10))
ax.grid()


q2_1.png


PCA


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pca = PCA(2)
pca_features = pca.fit_transform(x)
 
fig = plt.figure(figsize = (10,10))
ax = fig.add_subplot(1,1,1
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
 
for i in range(10):
    ax.scatter(pca_features[lab==i,0]
            ,pca_features[lab==i,1]
            , s = 10)
 
ax.legend(range(10))
ax.grid()


q2_2.png


TSNE


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
tsne = TSNE()
tsne_results = tsne.fit_transform(x)
 
fig = plt.figure(figsize = (10,10))
ax = fig.add_subplot(1,1,1
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component TNSE', fontsize = 20)
 
for i in range(10):
    ax.scatter(tsne_results[lab==i,0]
            ,tsne_results[lab==i,1]
            , s = 10)
 
ax.legend(range(10))
ax.grid()


q2_3.png


PCA_Q3


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd
import numpy as np
import numpy.linalg as lin
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
import time
 
df = pd.read_csv('train.csv')
 
X_train = df.drop('label', axis=1).values
target_label = df['label'].values
 
X_tr, X_test, y_tr, y_test = train_test_split(X_train, target_label, test_size=0.2, random_state = 2019)


original data standardization


1
2
3
4
5
standardizer = StandardScaler().fit(X_tr)
 
X_tr_std = standardizer.transform(X_tr)
X_test_std = standardizer.transform(X_test)
X_tr_std.shape #(33600, 784)


PCA (eigenvalue > 1)


1
2
3
4
5
6
7
8
9
10
cov_mat = np.cov(X_tr.T)
cov_mat.shape
explain_values_raw, components_raw = lin.eig(cov_mat)
pca_k = len(explain_values_raw[explain_values_raw > 1])
 
pca = PCA(pca_k).fit(X_tr_std)
pca_X_tr = pca.transform(X_tr_std)
pca_X_test = pca.transform(X_test_std)
components = pca.components_
pca_X_tr.shape #(33600, 649)


knn with original data


1
2
3
4
5
6
7
8
9
10
11
time_start = time.time()
real_knn_k = int(np.sqrt(X_tr.shape[0]))
real_knn = KNeighborsClassifier(n_neighbors = real_knn_k, n_jobs = -1)
real_knn.fit(X_tr_std, y_tr)
#clusters = real_knn.predict(X_test_std)
print'Accuracy: {} '.format(real_knn.score(X_test_std, y_test)))
print'Time elapsed: {} seconds'.format(time.time() - time_start))
'''
Accuracy: 0.9182142857142858 
Time elapsed: 183.388032913208 seconds
'''


knn with pca data


1
2
3
4
5
6
7
8
9
10
11
time_start = time.time()
pca_knn_k = int(np.sqrt(pca_X_tr.shape[0]))
pca_knn = KNeighborsClassifier(n_neighbors = pca_knn_k, n_jobs = -1)
pca_knn.fit(pca_X_tr, y_tr)
#clusters = pca_knn.predict(pca_X_test)
print'Accuracy: {} '.format(pca_knn.score(pca_X_test, y_test)))
print'Time elapsed: {} seconds'.format(time.time() - time_start))
'''
Accuracy: 0.9205952380952381 
Time elapsed: 162.1506233215332 seconds
'''


random forest with original data


1
2
3
4
5
6
7
8
9
10
time_start = time.time()
real_rf = RandomForestClassifier(n_estimators =10,  n_jobs = -1, random_state = 2019)
real_rf.fit(X_tr_std, y_tr)
#clusters = real_rf.predict(X_test_std)
print'Accuracy: {} '.format(real_rf.score(X_test_std, y_test)))
print'Time elapsed: {} seconds'.format(time.time() - time_start))
'''
Accuracy: 0.9364285714285714 
Time elapsed: 1.7449746131896973 seconds
'''


random forest with pca data


1
2
3
4
5
6
7
8
9
10
time_start = time.time()
pca_rf = RandomForestClassifier(n_estimators = 10,  n_jobs = -1, random_state = 2019)
pca_rf.fit(pca_X_tr, y_tr)
#clusters = pca_rf.predict(pca_X_test)
print'Accuracy: {} '.format(pca_rf.score(pca_X_test, y_test)))
print'Time elapsed: {} seconds'.format(time.time() - time_start))
'''
Accuracy: 0.8263095238095238 
Time elapsed: 6.1536946296691895 seconds
'''


knn의 k 개수는 통상적으로 사용되는 전체 데이터수의 제곱근을 사용하였다.

knn의 경우 original data에 비해 pca 데이터가 시간이 20초 가량 빨라졌다. ( test accuracy 약 0.01 하락)

random forest의 경우 test accuracy 약 0.1 감소하며 오히려 소요시간이 증가하는 모습을 보인다.

이는 original data의 원소들의 상당수가 0인것에 비해 pca 데이터는 모든 원소가 특정한 수를 가지고 있어서 연산량이 늘어난 것으로 보인다.


PCA (10)


1
2
3
4
5
pca = PCA(10).fit(X_tr_std)
pca_X_tr = pca.transform(X_tr_std)
pca_X_test = pca.transform(X_test_std)
components = pca.components_
pca_X_tr.shape #(33600, 10)


knn with pca (10) data


1
2
3
4
5
6
7
8
9
10
11
time_start = time.time()
pca_knn_k = int(np.sqrt(pca_X_tr.shape[0]))
pca_knn = KNeighborsClassifier(n_neighbors = pca_knn_k, n_jobs = -1)
pca_knn.fit(pca_X_tr, y_tr)
#clusters = pca_knn.predict(pca_X_test)
print'Accuracy: {} '.format( pca_knn.score(pca_X_test, y_test)))
print'Time elapsed: {} seconds'.format(time.time() - time_start))
'''
Accuracy: 0.8990476190476191 
Time elapsed: 0.6804764270782471 seconds
'''


random forest with pca (10) data


1
2
3
4
5
6
7
8
9
10
time_start = time.time()
pca_rf = RandomForestClassifier(n_estimators = 10,  n_jobs = -1, random_state = 2019)
pca_rf.fit(pca_X_tr, y_tr)
#clusters = pca_rf.predict(pca_X_test)
print'Accuracy: {} '.format( pca_rf.score(pca_X_test, y_test)))
print'Time elapsed: {} seconds'.format(time.time() - time_start))
'''
Accuracy: 0.8775 
Time elapsed: 0.8635261058807373 seconds
'''


pca 의 시간 감소를 확인하기위해 차원 수를 10으로 줄였다.

knn의 경우 original data가 183초 걸렸던 것에 비해 0.7초로 연산이 매우 빨라졌고 accuracy는 0.92에서 0.90으로 줄었다.

random forest의 경우 original data의 1.7초에서 0.86초로 빨라졌고 accuracy는 0.93에서 0.88로 감소하였다.


List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 R 소스 공유 게시판 이용 관련 공지사항 1 DataMarket 2014.05.21 34569
149 투빅스 10기&11기 7주차 CNN (Alexnet) - 11기 심은선 file 심은선 2019.03.15 41
148 투빅스 10기&11기 7주차 - NLP - 11기 유기윤 file 유기윤 2019.03.14 50
147 투빅스 10기&11기 6주차 Advanced Neural Network - 11기 김대웅 file 김대웅 2019.03.12 44
146 투빅스 10기&11기 5주차 Neural Network - 11기 김대웅 file 김대웅 2019.03.07 80
145 투빅스 10기&11기 4주차 Algorithm - 10기 정윤호 UNOVATE 2019.03.04 55
144 투빅스 10기&11기 4주차 ML Performance Tuning - 11기 김대웅 김대웅 2019.02.22 91
» 투빅스 10기&11기 4주차 PCA - 11기 임채빈 임채빈 2019.02.22 94
142 투빅스 10기&11기 3주차 Clustering - 11기 한재연 file 한재연 2019.02.16 119
141 투빅스 10기&11기 3주차 Decision Tree - 11기 김유민 file 2019.02.15 110
140 투빅스 10기&11기 3주차 Clustering - 11기 김대웅 file 김대웅 2019.02.15 143
139 투빅스 10기&11기 3주차 Algorithm - 11기 한재연 file 한재연 2019.02.15 98
138 투빅스 10기&11기3주차 앙상블(Kaggle HousePrice) - 11기 이소라 file 소라찌 2019.02.15 119
137 투빅스 10기&11기 2주차 SVM, Naive Bayes, KNN - 11기 유기윤 file 유기윤 2019.02.02 197
136 투빅스 10기&11기 2주차 SVM, Naive Bayes, KNN - 11기 김대웅 file 김대웅 2019.01.31 226
135 투빅스 10기&11기 1주차 Algorithm - 11기 한재연 1 file 한재연 2019.01.31 257
134 투빅스 10기&11기 1주차 Algorithm - 11기 권혜민 file 권혜민 2019.01.31 196
133 투빅스 10&11기 1주차 Linear Regression - 11기 유기윤 file 유기윤 2019.01.24 303
132 투빅스 10&11기 1주차 Regression - 11기 강수민 file 수민 2019.01.24 283
131 투빅스 10&11기 1주차 Logistic Regression - 11기 김대웅 file 김대웅 2019.01.23 271
130 투빅스 9&10기 8주차 CNN - 10기 장유영 장유영 2018.09.20 2020
Board Pagination ‹ Prev 1 2 3 4 5 6 7 ... 8 Next ›
/ 8

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5