评估随机森林,极端树,SVC,MLP的集成决策器对于决策结果的影响。

import numpy as np
import struct
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier,BaggingClassifier,VotingClassifier
from sklearn.svm import LinearSVC,SVC
from sklearn.linear_model import LogisticRegression,LinearRegression
from sklearn.model_selection import cross_val_score,train_test_split,GridSearchCV
from sklearn.metrics import accuracy_score,mean_squared_error
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.neural_network import MLPClassifier
#xtr,ytr分别是mnist数据集的测试集数据
xtr1,xte1,ytr1,yte1=train_test_split(xtr,ytr,test_size=10000,random_state=42)
xtr2,xte2,ytr2,yte2=train_test_split(xtr1,ytr1,test_size=10000,random_state=42)
#将6万的训练集数据分为3个子集。训练子集40000万个,验证子集10000个
rnd_clf=RandomForestClassifier(n_estimators=10,random_state=42)#随机森林
etc_clf=ExtraTreesClassifier(n_estimators=10, random_state=42)#极端随机树
svm_clf = LinearSVC(random_state=42)    #线性SVC分类
mlp_clf = MLPClassifier(random_state=42)#多层感知器
estimators=[rnd_clf,etc_clf,svm_clf,mlp_clf]
for estimator in estimators:
#    print('train thr',estimator)
    estimator.fit(xtr2,ytr2)

[estimator.score(xtr2,ytr2) for estimator in estimators]
#获得四个分类器在测试集上的得分
#

voting=[('rnd_clf',rnd_clf),('etc_clf',etc_clf),('svm_clf',svm_clf),('mlp_clf',mlp_clf)]
#建立投票器
voting_clf=VotingClassifier(estimators=voting)
voting_clf.fit(xtr2,ytr2)#训练数据
voting_clf.score(X_val, y_val)#查看训练分数

#由于SVM的得分远低于其他三个决策器,因此我删除SVM决策器看一下投票分数会不会提高

voting_clf.estimators_#查看SVM决策器在第几个位置
del voting_clf.estimators_[2]

voting_clf.score(X_val, y_val)#再次查看分数 发现分数有明显提高,这说明SVM拖累了决策结果

voting_clf.voting = "soft"#将投票器改为软投票
voting_clf.score(xte2,yte2)#分数显著提高



#以下部分是解析idx3的程序,也是上述使用的数据源。

file='E:/python工程/mnist/'
# 训练集文件
train_images_idx3_ubyte_file = file+'train-images.idx3-ubyte'
# 训练集标签文件
train_labels_idx1_ubyte_file = file+'train-labels.idx1-ubyte'

# 测试集文件
test_images_idx3_ubyte_file = file+'t10k-images.idx3-ubyte'
# 测试集标签文件
test_labels_idx1_ubyte_file = file+'t10k-labels.idx1-ubyte'

def decode_idx3_ubyte(idx3_ubyte_file):
    """
    解析idx3文件的通用函数
    :param idx3_ubyte_file: idx3文件路径
    :return: 数据集
    """
    # 读取二进制数据
    bin_data = open(idx3_ubyte_file, 'rb').read()

    # 解析文件头信息,依次为魔数、图片数量、每张图片高、每张图片宽
    offset = 0
    fmt_header = '>iiii' #因为数据结构中前4行的数据类型都是32位整型,所以采用i格式,但我们需要读取前4行数据,所以需要4个i。我们后面会看到标签集中,只使用2个ii。
    magic_number, num_images, num_rows, num_cols = struct.unpack_from(fmt_header, bin_data, offset)
    print('魔数:%d, 图片数量: %d张, 图片大小: %d*%d' % (magic_number, num_images, num_rows, num_cols))

    # 解析数据集
    image_size = num_rows * num_cols
    offset += struct.calcsize(fmt_header)  #获得数据在缓存中的指针位置,从前面介绍的数据结构可以看出,读取了前4行之后,指针位置(即偏移位置offset)指向0016。
    print(offset)
    fmt_image = '>' + str(image_size) + 'B'  #图像数据像素值的类型为unsigned char型,对应的format格式为B。这里还有加上图像大小784,是为了读取784个B格式数据,如果没有则只会读取一个值(即一副图像中的一个像素值)
    print(fmt_image,offset,struct.calcsize(fmt_image))
    images = np.empty((num_images, num_rows, num_cols))
    #plt.figure()
    for i in range(num_images):
        if (i + 1) % 10000 == 0:
            print('已解析 %d' % (i + 1) + '张')
            print(offset)
        images[i] = np.array(struct.unpack_from(fmt_image, bin_data, offset)).reshape((num_rows, num_cols))
        #print(images[i])
        offset += struct.calcsize(fmt_image)
#        plt.imshow(images[i],'gray')
#        plt.pause(0.00001)
#        plt.show()
    #plt.show()

    return images


def decode_idx1_ubyte(idx1_ubyte_file):
    """
    解析idx1文件的通用函数
    :param idx1_ubyte_file: idx1文件路径
    :return: 数据集
    """
    # 读取二进制数据
    bin_data = open(idx1_ubyte_file, 'rb').read()

    # 解析文件头信息,依次为魔数和标签数
    offset = 0
    fmt_header = '>ii'
    magic_number, num_images = struct.unpack_from(fmt_header, bin_data, offset)
    print('魔数:%d, 图片数量: %d张' % (magic_number, num_images))

    # 解析数据集
    offset += struct.calcsize(fmt_header)
    fmt_image = '>B'
    labels = np.empty(num_images)
    for i in range(num_images):
        if (i + 1) % 10000 == 0:
            print ('已解析 %d' % (i + 1) + '张')
        labels[i] = struct.unpack_from(fmt_image, bin_data, offset)[0]
        offset += struct.calcsize(fmt_image)
    return labels


def load_train_images(idx_ubyte_file=train_images_idx3_ubyte_file):
    """
    TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
    [offset] [type]          [value]          [description]
    0000     32 bit integer  0x00000803(2051) magic number
    0004     32 bit integer  60000            number of images
    0008     32 bit integer  28               number of rows
    0012     32 bit integer  28               number of columns
    0016     unsigned byte   ??               pixel
    0017     unsigned byte   ??               pixel
    ........
    xxxx     unsigned byte   ??               pixel
    Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

    :param idx_ubyte_file: idx文件路径
    :return: n*row*col维np.array对象,n为图片数量
    """
    return decode_idx3_ubyte(idx_ubyte_file)


def load_train_labels(idx_ubyte_file=train_labels_idx1_ubyte_file):
    """
    TRAINING SET LABEL FILE (train-labels-idx1-ubyte):
    [offset] [type]          [value]          [description]
    0000     32 bit integer  0x00000801(2049) magic number (MSB first)
    0004     32 bit integer  60000            number of items
    0008     unsigned byte   ??               label
    0009     unsigned byte   ??               label
    ........
    xxxx     unsigned byte   ??               label
    The labels values are 0 to 9.

    :param idx_ubyte_file: idx文件路径
    :return: n*1维np.array对象,n为图片数量
    """
    return decode_idx1_ubyte(idx_ubyte_file)


def load_test_images(idx_ubyte_file=test_images_idx3_ubyte_file):
    """
    TEST SET IMAGE FILE (t10k-images-idx3-ubyte):
    [offset] [type]          [value]          [description]
    0000     32 bit integer  0x00000803(2051) magic number
    0004     32 bit integer  10000            number of images
    0008     32 bit integer  28               number of rows
    0012     32 bit integer  28               number of columns
    0016     unsigned byte   ??               pixel
    0017     unsigned byte   ??               pixel
    ........
    xxxx     unsigned byte   ??               pixel
    Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

    :param idx_ubyte_file: idx文件路径
    :return: n*row*col维np.array对象,n为图片数量
    """
    return decode_idx3_ubyte(idx_ubyte_file)


def load_test_labels(idx_ubyte_file=test_labels_idx1_ubyte_file):
    """
    TEST SET LABEL FILE (t10k-labels-idx1-ubyte):
    [offset] [type]          [value]          [description]
    0000     32 bit integer  0x00000801(2049) magic number (MSB first)
    0004     32 bit integer  10000            number of items
    0008     unsigned byte   ??               label
    0009     unsigned byte   ??               label
    ........
    xxxx     unsigned byte   ??               label
    The labels values are 0 to 9.

    :param idx_ubyte_file: idx文件路径
    :return: n*1维np.array对象,n为图片数量
    """
    return decode_idx1_ubyte(idx_ubyte_file)



if __name__ == '__main__':
    xtr = load_train_images().reshape(60000,28*28)
    ytr = load_train_labels()
    xte = load_test_images().reshape(10000,28*28)
    yte = load_test_labels()

    # 查看前十个数据及其标签以读取是否正确
  #  for i in range(10):
  #      print(mnist_ytr[i])
  #      plt.imshow(mnist_xtr[i], cmap='gray')
  #      plt.pause(0.000001)
  #      plt.show()
  #  print('done')



猜你喜欢

转载自blog.csdn.net/lisenby/article/details/108663201