目录
对于Otto数据集如果做PCA降维使用,那么不涉及它的Target标签部分。
PCA
***训练部分***
1.工具
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
2.准备数据
dpath='./data/'
train=pd.read_csv(dpath+'Ottoo_train.csv')
y_train=train['target']
X_train=train.drop(['id','target'],axis=1)
#用于存储pca变换后的特征
train_id=train['id']
3.PCA降维
pca=PCA(n_components=0.85)
pca.fit(X_train)
#在训练集合测试集上降维
X_train_pca=pca.transform(X_train)
4.绘制PCA维的方差
import matplotlib.pyplot as plt
plt.bar(range(len(pca.explained_variance_ratio_)),pca.explained_variance_ratio)
plt.show()
5.保存结果,PCA降维后的表示可作为特征提取的一部分
#保存PCA特征变换结果
n_components=pca.n_components_
feat_names_pca=[]
for i in range(n_components):
feat_names_pca.append('pca_'+str(i))
y=pd.Series(data=y_train,name='target')
train_pca=pd.concat([train_id,pd.DataFrame(columns=feat_names_pca,
data=X_train_pca)])
train_pca.to_csv(dpath+'Otto_FE_train_PCA.csv')
6.保存特征编码过程中用到的模型,用于后续对测试数据的编码
import pickle
pickle.dump(pca,open('pca.pkl','wb'))
7.PCA前两维上显示降维后的数据分布
def plot_embedding_PCA(data,targets,colors,title):
fig=plt.figure(figsize=(8,8))
ax=fig.add_subplot(1,1,1)
for target,color in zip(targets,colors):
indicesToKeep=data['target']==target
ax.scatter(data.loc[indicesToKeep,'pca_0'],
data.loc[indicesToKeep,'pca_1'],
c=color,
s=50)
ax.legend(targets)
ax.grid()
ax.set_xlabel('Principal Component 1',fontsize=15)
ax.set_ylabel('Principal Component 2',fontsize=15)
ax.set_title(title,fontsize=20)
targets=[]
colors=[]
for i in range(9):
colors.append(plt.cm.Set1(i/10.0))
targets.append('Class_'+str(i+1))
plot_embedding_PCA(train_pca,targets,colors,'PCA embedding of DataSet')
输出结果:
从图中可以看出PCA前两维不能分开不同类别的商品
***测试部分***
测试集PCA编码
读取数据
dpath='./data/'
test=pd.read+csv(dpath+'Otto_test.csv')
准备数据
#暂存id,用于保存特征变换后的结果并用于结果提交
test_id=test['id']
X_test=test.drop(['id'],axis=1)
PCA降维
import pickle
pca=pickle.load(open('pca.pkl','rb'))
#在训练集和测试集降维
X_test_pca=pca.transform(X_test)
保存结果,PCA降维后的表示可作为特征提取的一部分
#保存PCA特征变换结果
n_components=pca.n_components_
feat_name_pca=[]
for i in range(n_components):
feat_names_pca.append('pca_'+str(i))
test_pca=pd.concat([test_id,pd.DataFrame(columns=feat_names_pca,
data=X_test_pca)],axis=1)
test_pca.to_csv(dpath+'Otto_FE_test_PCA.csv',index=False,header=True)
tNSE
***训练部分***
1.工具
import pandas as pd
import numpy as np
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
2.读取数据
dpath='./data/'
train=pd.read_csv(dpath+'Otto_train.csv')
#如果要对test做降维,需要和训练数据一起训练模型
#TNSE太慢,这里只尝试对训练数据进行降维
print(train.head())
3.准备数据
y_train=train['target']
X_train=train.drop(['id','target'],axis=1)
train_id=train['id']
X=X_train
4.TNSE降维
#时间较长
tsne=TSNE(n_components=2,random_state=0)
#模型训练,并得到降维后的表示
X_tsne=tsne.fit_transform(X)
5.保存结果,TSNE降维后的表示可作为特征提取的一部分
#保存TSEN降维后的结果
n_components=2
feat_names_tnse=[]
for i in range(n_components):
feat_names_tsne.append('tnse_'+str(i))
y=pd.Series(data=y_train,name='target')
train_tnse=pd.concat([train_id,pd.DataFrame(columns=feat_names_tsne,
data=X_tsne)],axis=1)
train_tnse.to_csv(dpath+'Otto_FE_train_tnse.csv',index=False,header=True)
#如果训练数据和测试数据一起降维的话,可以通过训练样本数目从x_tsne分离 出训练数据和测试数据
6.在TNSE前两维上显示降维后的数据分布
def plot_embedding_TNSE(data,targets,colors,title):
fig=plt.figure(figsize=(8,8))
ax=fig.add_subplot(1,1,1)
for target,color in zip(targets,colors):
indicesToKeep=data['target']==target
ax.scatter(data.loc[indicesToKeep,'tnse_1'],
data.loc[indicesToKeep,'tsne_1'],
c=color,
s=50)
ax.legend(targets)
ax.grid()
ax.set_xlabel('TNSE 1',fontsize=15)
ax.set_ylabel('TNSE 2',fontsize=15)
ax.set_title(title,fontsize=20)
targets=[]
colors=[]
for i in range(9):
colors.append(plt.cm.Set1(i/10.0))
target.append('Class_'+str(i+1))
plot_embedding_TNSE(train_tnse,targets,colors,'TNSE embedding of TNSE')