书中关于算法原理和基础知识介绍的很详细,话不多数,直接上代码。
代码6-1:拉格朗日插值代码
#-*- coding: utf-8 -*-
#拉格朗日插值代码
import pandas as pd #导入数据分析库Pandas
from scipy.interpolate import lagrange #导入拉格朗日插值函数
inputfile = '../data/missing_data.xls' #输入数据路径,需要使用Excel格式;
outputfile = '../tmp/missing_data_processed.xls' #输出数据路径,需要使用Excel格式
data = pd.read_excel(inputfile, header=None) #读入数据
#自定义列向量插值函数
#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s, n, k=5):
y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数
y = y[y.notnull()] #剔除空值
return lagrange(y.index, list(y))(n) #插值并返回插值结果
#逐个元素判断是否需要插值
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]: #如果为空即插值。
data[i][j] = ployinterp_column(data[i], j)
data.to_excel(outputfile, header=None, index=False) #输出结果
按照代码内容,装载需要的文件,运行代码不会出错,但是会有一个警告,无伤大雅,具体的如下:
Future Warning: passing list_likes to .loc or [] with any missing label will raise KeyError, you can use .reindex() as an alternative.
这个警告可以在以后的代码中注意,遇到的话可以按照修改意见来参考修改。
代码6-2、6-3、6-4、6-5综合
#-*- coding: utf-8 -*-
import pandas as pd
from random import shuffle
datafile = '../data/model.xls'
data = pd.read_excel(datafile)
data = data.as_matrix()
shuffle(data)
p = 0.8 #设置训练数据比例
train = data[:int(len(data)*p),:]
test = data[int(len(data)*p):,:]
from keras.models import Sequential #导入神经网络初始化函数
from keras.layers.core import Dense, Activation #导入神经网络层函数、激活函数
netfile = '../tmp/net.model' #构建的神经网络模型存储路径
net = Sequential() #建立神经网络
net.add(Dense(3, 10)) #添加输入层(3节点)到隐藏层(10节点)的连接
net.add(Activation('relu')) #隐藏层使用relu激活函数
net.add(Dense(10, 1)) #添加隐藏层(10节点)到输出层(1节点)的连接
net.add(Activation('sigmoid')) #输出层使用sigmoid激活函数
net.compile(loss = 'binary_crossentropy', optimizer = 'adam', class_mode = "binary") #编译模型,使用adam方法求解
net.fit(train[:,:3], train[:,3], nb_epoch=1000, batch_size=1) #训练模型,循环1000次
net.save_weights(netfile) #保存模型
from sklearn.metrics import confusion_matrix #导入混淆矩阵函数
predict_result = net.predict_classes(train[:,:3]).reshape(len(train)) #预测结果变形
'''这里要提醒的是,keras用predict给出预测概率,predict_classes才是给出预测类别,而且两者的预测结果都是n x 1维数组,而不是通常的 1 x n'''
cm = confusion_matrix(train[:,3], predict_result) #混淆矩阵
import matplotlib.pyplot as plt #导入作图库
plt.matshow(cm, cmap=plt.cm.Greens) #画混淆矩阵图,配色风格使用cm.Greens,更多风格请参考官网。
plt.colorbar() #颜色标签
for x in range(len(cm)): #数据标签
for y in range(len(cm)):
plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
plt.ylabel('True label') #坐标轴标签
plt.xlabel('Predicted label') #坐标轴标签
plt.show() #显示作图结果
from sklearn.metrics import roc_curve #导入ROC曲线函数
predict_result = net.predict(test[:,:3]).reshape(len(test))
fpr, tpr, thresholds = roc_curve(test[:,3], predict_result, pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label = 'ROC of LM') #作出ROC曲线
plt.xlabel('False Positive Rate') #坐标轴标签
plt.ylabel('True Positive Rate') #坐标轴标签
plt.ylim(0,1.05) #边界范围
plt.xlim(0,1.05) #边界范围
plt.legend(loc=4) #图例
plt.show() #显示作图结果
第一处:data=data.as_martix(),还是和以前一样的错误,修改为data=data.values。
第二处:net.add(Dense(3,10)),以前也出现过,修改为Dense(10,input_dim=3),后面的同理。
第三处:net.complie函数中出现的,以前也出现过,class_mode="binary" not support,修改为metrics=['accuracy']。
警告如下:
1. plt.tight_layout doesn`t always work, but plt.save('fig.png',bbox_inches='tight') does.
2.userwarning:This figure includes AXES that are not compatible with tight_layout,so result might be incorrect.
3.sklearn.externals.joblib will be removed in 0.23,import this functionality directly from joblib.
哈哈哈哈,到这里这篇文章就结束啦,不要问我为什么要这样改,其实我也不知道为什么要这样改。过几天更新下一篇,么么哒。