对PCA降维后的手写体数字图片数据分类

对PCA降维后的手写体数字图片数据分类

实验目的:

会用Python对数据进行PCA降维;

使用多层感知机对PCA降维后的手写体数字图数据训练分类模型,对测试数据分类;

会通过调整主成分贡献率来提高分类效果。

实验内容:

使用sklearn.decomposition的PCA类对手写体数字图片数据进行降维。使用sklearn.neural_network的MLPClassifier类对降维后的数据训练分类模型,对测试数据进行分类,要求分类准确率达到80%以上。

训练数据:digits_training.csv

测试数据:digits_testing.csv

第1列是类别,其他列是特征属性。

  1. 载入训练数据、分出特征属性和类别,对特征属性标准化,显示读入数据的行数
  2. 使用PCA对数据降维,显示主成分个数
  3. 使用多层感知机对PCA降维后的数据训练分类模型,保存分类模型为mlpNN_pca.m
  4. 载入测试数据、分出特征属性和类别,对特征属性标准化,显示读入数据的行数
  5. 使用分类模型对测试数据分类,显示分类准确率

用到pandas, numpy,sklearn.decomposition,joblib, MPLClassifier类库

  • 首先读取数据
pandas.read_csv('dataset/digits_training.csv')
  • 数据预处理
# 划分特征属性,分类属性
xTrain = trainData.values[:,1:]
yTrain = trainData.values[:,0]
  • 数据降维
# 特征属性标准化
# 数据降维
def normalizeData(X):
 return X- numpy.mean(X,axis =0)
pca = PCA(n_components= float or int or str)
xTrain = pca.fit_transform(xTrain)
  • 训练神经网络模型
mpl = MPLClassifier(solver="lbfgs",alpha=1e-5,hidden_layer_size(48,24),random_state=1)
mpl.flt(xTrain.yTrain)
  • 载入测试数据
pandas.read_csv(dataset/digits_testing.csv)
  • 使用mpl模型进行分类
model = joblib.load('ml.m')
equal = model.predict(xTest)
  • 计算分类正确率
print("正确率",(equal==yTest).sum()/len(yTest))

完整代码

from sklearn.neural_network import MLPClassifier
from sklearn.decomposition import PCA
import numpy
import pandas
import joblib

'''
PCA降维小结
1.实现过程有两种:Python的Numpy库;SKlearn的PCA模块,两者的计算结果是相同的。
2.数据降维的结果不一定都是好的,所以在解决实际问题,要同时计算降维前与降维后的结果,进行比较。
3.降维后的数据是不可解释的,但不影响最终的计算结果。
'''

print("1.载入训练数据,对自变量进行标准化,输出训练数据的样本数……")
# trainData = numpy.loadtxt('dataset/digits_training.csv')
trainData = pandas.read_csv("dataset/digits_training.csv")
# print(trainData)
# 获取数据集行数【0】(【1】表示列数)
# print(trainData.shape[0])
'''
TypeError: unhashable type: 'slice'
针对这个error,有两种解决办法
1. 读取数据时,去掉表头(数据头)pandas.read_csv("...csv",header = None)
2. 使用values()函数
'''

# 获取第二列之后的全部列(特征属性)
xTrain = trainData.values[:,1:]
# print(xTrain)
# 获取第一列(分类属性)
yTrain = trainData.values[:,0]
# print(yTrain)


# 对特征属性标准化
def normalizeData(X):
    return X- numpy.mean(X,axis=0)
xTrain = normalizeData(xTrain)
print('装载训练数据: {0} 条'.format(xTrain.shape[0]))

# PCA数据降维
print('2.使用PCA对数据降维,取累积贡献率超过95%的前K个元素……')

'''
float 类型数据
If 0 < n_components < 1 and svd_solver == 'full', 
select the number of components such that the amount of variance that needs to be explained
 is greater than the percentage specified by n_components.
'''
pca = PCA(n_components=0.95,svd_solver='full')
# print(pca.n_components)
xTrain = pca.fit_transform(xTrain)
# print(newX)
print("选取了 {}个主成分".format(xTrain.shape[1]))
print("训练数据维度:{}".format(xTrain.shape))
# total_ratio = 0
# for i in range(len(pca.explained_variance_ratio_)):
#     total_ratio +=pca.explained_variance_ratio_[i]
# print(total_ratio)
# print(pca.)
print("3.使用神经网络(多层感知机)训练分类模型")
# 构建模型
mpl = MLPClassifier(solver="lbfgs",alpha=1e-5,hidden_layer_sizes=(48,24),random_state=1)
# 训练模型
mpl.fit(xTrain,yTrain)
print("4.保存分类模型……")
joblib.dump(mpl,'mlpNN_pca.m')

print("5.载入测试数据,对自变量进行标准化,输出测试数据的样本数……")
testData = pandas.read_csv("dataset/digits_testing.csv")
xTest = testData.values[:,1:]
yTest = testData.values[:,0]
xTest = normalizeData(xTest)
xTest = pca.transform(xTest)
# xTest = PCA(n_components=149,svd_solver='full').fit_transform(xTest)
print('测试数据维度:{}'.format(xTest.shape))
print("6.使用模型对测试数据分类……")
'''
降维技术使得数据变得更易使用,并且能够去除数据中的噪音,使得其他机器学习任务更加精确。
降维技术往往作为预处理步骤,在数据应用到其他算法之前清洗数据。
PCA优点:降低数据复杂性,识别最重要的N个特征。
缺点:不一定需要,且可能损失有用的信息。
'''
model = joblib.load('mlpNN_pca.m')
equal = model.predict(xTest)
print("输出模型准确率……")
print("错误:",(equal!=yTest).sum())
print("测试数据准确率:",(equal==yTest).sum()/len(yTest))
  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值