Python数据分析与挖掘实战中的错误总结与分析--电力窃漏电用户自动识别

书中关于算法原理和基础知识介绍的很详细,话不多数,直接上代码。

代码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.

哈哈哈哈,到这里这篇文章就结束啦,不要问我为什么要这样改,其实我也不知道为什么要这样改。过几天更新下一篇,么么哒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章