Otto商品分类--PCA&tSNE

目录

PCA

***训练部分***

1.工具

2.准备数据

3.PCA降维

4.绘制PCA维的方差

5.保存结果,PCA降维后的表示可作为特征提取的一部分

6.保存特征编码过程中用到的模型,用于后续对测试数据的编码

7.PCA前两维上显示降维后的数据分布

***测试部分***

读取数据

准备数据

PCA降维

保存结果,PCA降维后的表示可作为特征提取的一部分

tNSE

***训练部分***

1.工具

2.读取数据

3.准备数据

4.TNSE降维

5.保存结果,TSNE降维后的表示可作为特征提取的一部分

6.在TNSE前两维上显示降维后的数据分布


对于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')

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值