使用PCA核方法對糖尿病資料集降維
主要步驟流程:
- 1. 匯入包
- 2. 匯入資料集
- 3. 資料預處理
- 3.1 檢測缺失值
- 3.2 生成自變數和因變數
- 3.3 拆分訓練集和測試集
- 3.4 特徵縮放
- 4. 使用 Kernel PCA 降維
- 5. 構建邏輯迴歸模型
- 5.1 使用原始資料構建邏輯迴歸模型
- 5.2 使用降維後資料構建邏輯迴歸模型
- 6. 視覺化Kernel PCA 降維效果
1. 匯入包
In [2]:
# 匯入包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
2. 匯入資料集
In [3]:
# 匯入資料集
dataset = pd.read_csv('pima-indians-diabetes.csv')
dataset
Out[3]:
3. 資料預處理
3.1 檢測缺失值
In [4]:
# 檢測缺失值
null_df = dataset.isnull().sum()
null_df
Out[4]:
3.2 生成自變數和因變數
In [5]:
# 生成自變數和因變數
X = dataset.iloc[:,0:8].values
y = dataset.iloc[:,8].values
3.3 拆分訓練集和測試集
In [6]:
# 拆分訓練集和測試集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size = 0.2, random_state = 1)
print(X_train.shape)
3.4 特徵縮放
In [7]:
# 特徵縮放
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
4. 使用 Kernel PCA 降維
In [128]:
# 使用 Kernel PCA 生成新的自變數
from sklearn.decomposition import KernelPCA
kernel_pca = KernelPCA(n_components = 3, kernel='sigmoid')
X_train_kernel_pca = kernel_pca.fit_transform(X_train)
print(X_train_kernel_pca)
In [129]:
X_test_kernel_pca = kernel_pca.transform(X_test)
n_components的值需要不斷嘗試
5. 構建邏輯迴歸模型
5.1 使用原始資料構建邏輯迴歸模型
In [130]:
# 構建模型
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(penalty='l2', C=1,
class_weight='balanced', random_state = 0)
classifier.fit(X_train, y_train)
Out[130]:
In [131]:
# 預測測試集
y_pred = classifier.predict(X_test)
In [132]:
# 評估模型效能
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred))
5.2 使用降維後資料構建邏輯迴歸模型
In [133]:
# 構建模型
classifier = LogisticRegression(penalty='l2', C=1,
class_weight='balanced', random_state = 0)
classifier.fit(X_train_kernel_pca, y_train)
Out[133]:
In [134]:
# 預測測試集
y_pred = classifier.predict(X_test_kernel_pca)
In [135]:
# 評估模型效能
print(accuracy_score(y_test, y_pred))
In [137]:
import seaborn as sns
ne=pd.concat([pd.DataFrame(X_train_kernel_pca),
pd.DataFrame(y_train)],axis=1).reset_index(drop=True)
ne.columns = ['a', 'b', 'c', 'd']#, 'e','f','g','h']
antV = ['#1890FF', '#2FC25B']
sns.pairplot(ne,palette=antV,hue='d')
Out[137]:
6. 視覺化Kernel PCA 降維效果
In [138]:
from matplotlib.colors import ListedColormap
X_set, y_set = X_train_kernel_pca, y_train
for i, j in enumerate(np.unique(y_set)):
plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
color = ListedColormap(('red', 'green'))(i), label = j)
plt.title('PCA Viz')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.legend()
plt.show()
經過Kernel PCA降維,自變數由8個變為2個。
將降維後的2個主成分視覺化,可以看到,如果以2個主成分訓練邏輯迴歸模型,模型效能會較差,因為肉眼可見,2個類別之間沒有明顯的界限。