使用tensorflow和keras对输入数据和输出提取主要特征,以实现来提高决策树的准确率

首先导入所需要的库
import tensorflow as tf
from keras.models import Model  # 泛型模型
from keras.layers import Dense, Input
import matplotlib.pyplot as plt
import h5py
from sklearn import tree

没有的可以使用pip install 库名  进行下载

导入所需要提取的图片数据
path = './usps.h5'
with h5py.File(path, 'r') as hf:
    train = hf.get('train')
    x_trian = train.get('data')[:]#0-1 float
    x_target = train.get('target')[:]  # train数据集合的权重 0-9
    test = hf.get('test')
    Y_test = test.get('data')[:]
    Y_target = test.get('target')[:]

设置最低特征压缩维度
# 压缩特征维度至120维
encoding_dim = 120

设置输入数据维度
# this is our input placeholder
input_img = Input(shape=(256,))

设置编码层,维度下降的越缓慢越好,但是层数太多运行速度会很慢
# 编码层
encoded = Dense(220, activation='sigmoid')(input_img)#(-1,1),activity_regularizer=sparse
encoded = Dense(200, activation='sigmoid')(encoded)
encoded = Dense(170, activation='sigmoid')(encoded)
encoded = Dense(150, activation='sigmoid')(encoded)
encoder_output = Dense(encoding_dim)(encoded)

和编码层对称
# 解码层
decoded = Dense(150, activation='sigmoid')(encoder_output)#(0.1)
decoded = Dense(170, activation='sigmoid')(decoded)
decoded = Dense(200, activation='sigmoid')(decoded)
decoded = Dense(220, activation='sigmoid')(decoded)
decoded = Dense(256, activation='sigmoid')(decoded)  #(0,max)

构建编码层的模型,用来提取编码层的特征
#构建编码模型,提取特征,输入数据(input_img)和输出编码层数据(encoder_output)
encoder =Model(inputs=input_img,outputs=encoder_output)

同理,构建解码层的模型,用来提取编码层的特征
# 构建稀疏自编码模型输入数据(input_img)和输出解码层数据(decoder)
autoencoder = Model(inputs=input_img, outputs=decoded)

对解码层模型进行适配,寻找最优点可以通过修改优化器下降速度和损失函数的类型来是模型更接近最优值,不至于达到局部最优
# compile autoencoder
autoencoder.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06),loss='mse')#优化器二阶  损失函数为均方误差

模型适配的运行结果

执行700次之后的收敛情况
几乎没有太大变动了,可以看出其已达”最优解“,如果最终准确率还是不理想也可以调节优化器的学习率,或者更换优化器或损失函数

#训练cnn模型
autoencoder.fit(x_trian, x_trian, epochs=700, batch_size=30, shuffle=True)

对输入数据和预测数据提取主要特征
t1=encoder.predict(x_trian)
t2=encoder.predict(Y_test)


#使用已经调好参数的决策树模型
clf = tree.DecisionTreeClassifier(criterion='entropy', min_samples_leaf=5, max_depth=11, min_samples_split=7,random_state=42)
#训练决策树模型
clf.fit(t1,x_target)
#使用决策树模型进行预测
t=clf.predict(t2)

进行柱状图可视化展示
x_label=[0,1,2,3,4,5,6,7,8,9]
y_label=[0,0,0,0,0,0,0,0,0,0]
k=0
for i in range(len(t)):
        if Y_target[i]!=t[i]:
            print("分错样本为:{}\t原样本:{}".format(t[i],Y_target[i]))
            y_label[Y_target[i]]+=1
            k+=1
print("准确率为:{} 分错个数{} 总数{}".format((len(t)-k)/len(t),k,len(t)))
#进行画图
plt.bar(x_label,y_label, 0.4, color="green")
plt.xlabel("origin")
plt.ylabel("number")
plt.title("tree")
plt.show()

可视化展示结果

使用tensorflow和keras对输入数据和输出提取主要特征,以实现来提高决策树的准确率_第1张图片

你可能感兴趣的:(特征提取,人工智能,tensorflow,keras,决策树)