小牛的学习笔记--鸢尾花多分类

多分类;热编码的转化;10交叉验证

一、导入包;设置随机种子数;导入数据集;分离属性和类别标签

# Multiclass Classification with the Iris Flowers Dataset
import numpy
from pandas import read_csv
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from keras.utils import np_utils
from sklearn.model_selection import cross_val_score#交叉验证的分数结果
from sklearn.model_selection import KFold
from sklearn.preprocessing import LabelEncoder
from sklearn.pipeline import Pipeline


# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)


# load dataset
dataframe = read_csv("iris.csv", header=None)
dataset = dataframe.values
X = dataset[:,0:4].astype(float)
Y = dataset[:,4]

二、字符串->数值->热编码

Y的标签值要改为热编码(one hot encoded)形式在这里插入图片描述
热编码形式:
在这里插入图片描述
我们可以首先使用scikit learn类中的LabelEncoder将字符串编码为整数,把字符串转换成整数,整数随机不用管,再用to_categorical函数把整数转化为热编码,其中相应的包#np_utils为多分类标签的转换

# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
# convert integers to dummy variables (i.e. one hot encoded)
dummy_y = np_utils.to_categorical(encoded_Y)

三、建立模型

def baseline_model()封装了建立模型和编译模型

#def baseline_model()封装了建立模型和编译模型
def baseline_model():
    # create model
    model = Sequential()
    model.add(Dense(8, input_dim=4, activation='relu'))#隐藏层用relu
    model.add(Dense(3, activation='softmax'))#多分类中,输出层神经元是3个,表示3类,激活函数是softmax
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])#多分类编译模型时用到的损失函数是loss='categorical_crossentropy
    return model

这里注意多分类和二分类的区别
1.输出层的激活函数改变,这里多分类为activation=‘softmax’,二分类中为activation=‘sigmoid’
2.输出层的神经元的个数改变,二分类是2,那么十分类输出10,这里是三分类,所以输出的是3
3.损失函数改变:这里的损失函数为loss=‘categorical_crossentropy’,二分类中损失函数为loss=‘binary_crossentropy’

四、评估模型

建立模型创建的函数名为 baseline_model()

estimator = KerasClassifier(build_fn=baseline_model, epochs=200, batch_size=5, verbose=0)#参数是创建模型所使用的函数名,用来做模型的训练
kfold = KFold(n_splits=10, shuffle=True, random_state=seed)#kfold来设置交叉验证的方式,shuffle()方法将序列的所有元素随机排序,ture分之间随机打乱,seed每次分的是一样的
results = cross_val_score(estimator, X, dummy_y, cv=kfold)

print("Accuracy: %.2f%% (%.2f%%)" % (results.mean() * 100, results.std() * 100))#打印交叉验证的结果,平均值;稳定性

输出结果:结果为十次交叉验证的平均值和方差在这里插入图片描述

你可能感兴趣的:(小牛的学习笔记--鸢尾花多分类)