sklearn 的Keras对二分类变量的应用
深度学习更适合较大的数据,数据量小的时候其实传统的机器学习效果更好。
Keras的底层库使用Theano或TensorFlow,这两个库也称为Keras的后端。
张量(tensor),可以看作是向量、矩阵的自然推广,用来表示广泛的数据类型。张量的阶数也叫维度。
0阶张量,即标量,是一个数。
1阶张量,即向量,一组有序排列的数
2阶张量,即矩阵,一组向量有序的排列起来
3阶张量,即立方体,一组矩阵上下排列起来
4阶张量......
Keras有两种类型的模型,序贯模型(Sequential)和函数式模型(Model),函数式模型应用更为广泛,序贯模型是函数式模型的一种特殊情况。
a)序贯模型(Sequential):单输入单输出,一条路通到底,层与层之间只有相邻关系,没有跨层连接。这种模型编译速度快,操作也比较简单
b)函数式模型(Model):多输入多输出,层与层之间任意连接。这种模型编译速度慢。
可以通过向Sequential模型传递一个layer的list来构造该模型。也可以通过.add()方法一个个的将layer加入模型中
激活函数
softmax: 在多分类中常用的激活函数,是基于逻辑回归的。
Softplus:softplus(x)=log(1+e^x),近似生物神经激活函数
Relu:近似生物神经激活函数
tanh:双曲正切激活函数,常用
sigmoid:S型曲线激活函数,最常用
hard_sigmoid:基于S型激活函数。
linear:线性激活函数,最简单
from keras import backend as K
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
from keras.optimizers import Adam
# 以上两个都属于优化器optimizer的方法类别
from keras.datasets import mnist
import numpy
'''
第一步:选择模型
'''
model = Sequential()
# 选的单输入单输出相对简单的序贯模型
'''
第二步:构建网络层
对输入层、隐藏层、输出层分别定义参数,要定义三次
'''
model.add(Dense(100,input_shape=(9,)))
# 我们一共有9个自变量,所以输入数据大小为9。输入层因为是二维数据n*p,直接将向量个数n输入就行。如果是三维数据n*m*p,input_shape则n*m
model.add(Activation('tanh')) # 激活函数是tanh
model.add(Dropout(0.5)) # 采用50%的dropout
model.add(Dense(100)) # 隐藏层节点100个
model.add(Activation('tanh')) # 激活函数是tanh
model.add(Dropout(0.5)) # 在训练过程中每次更新参数时随机断开一定百分比(rate)的输入神经元,防止过拟合。
model.add(Dense(2)) # 输出结果是2个类别,两个节点
model.add(Activation('softmax')) # 最后一层用softmax作为激活函数
'''
第三步:编译
优化器optimizer:该参数可指定为已预定义的优化器名,如rmsprop、adagrad,或一个Optimizer类的对象
损失函数loss:该参数为模型试图最小化的目标函数,它可为预定义的损失函数名,如categorical_crossentropy、mse,也可以为一个损失函数。
'''
model.compile(loss='binary_crossentropy', optimizer=Adam(), metrics=['accuracy']) # 使用交叉熵作为loss函数
'''
第四步:训练
.fit的一些参数
batch_size:对总的样本数进行分组,每组包含的样本数量
epochs :训练次数
shuffle:是否把数据随机打乱之后再进行训练
validation_split:拿出百分之多少用来做交叉验证
verbose:屏显模式 0:不输出 1:输出进度 2:输出每次的训练结果
'''
df['y'] = df['y'].map(int)
X_train, Y_train = df_train.ix[:, 2:].values, df_train.ix[:,1:2].values
X_test, Y_test = df_test.ix[:, 2:].values, df_test.ix[:,1:2].values
Y_train = (numpy.arange(2) == Y_train).astype(int)
# 将Y值转化为哑变量数组
Y_test = (numpy.arange(2) == Y_test).astype(int)
# 将Y_train,Y_test转化成哑变量的形式作为入模型的变量。比如[[1],[0],[1]] 转化为[[0,1],[1,0],[0,1]]
model.fit(X_train,Y_train,batch_size=200,epochs=50,shuffle=True,verbose=0,validation_split=0.3)
model.evaluate(X_test, Y_test, batch_size=200, verbose=0)
'''
第五步:输出
'''
print("test set")
scores = model.evaluate(X_test,Y_test,batch_size=200,verbose=0)
# print("The test loss is %f" % scores)
# 输出损失得分
result = model.predict(X_test,batch_size=200,verbose=0)
# 预测结果([预测为0的概率,预测为1的概率])
result_max = numpy.argmax(result, axis = 1)
test_max = numpy.argmax(Y_test, axis = 1)
# 预测结果精度计算
result_bool = numpy.equal(result_max, test_max)
true_num = numpy.sum(result_bool)
print("预测精度")
print("The accuracy of the model is %f" % (true_num/len(result_bool)))
df数据框的第一列是"DATA_NO",
第二列是数值型的目标变量"y"
其余列是woe转化后的数值型自变量"x1"..."xn"
参考借鉴了这个博主的笔记↓
深度学习:Keras入门(一)之基础篇
中文文档↓
keras中文文档