分享一個基於深度學習神經網路做的一個分類器

分享一個最近調試成功的基於深度學習的一個分類器,沒有用CNN RNN那些,只是想做一個簡單的全連接分類器,實現價值流失用戶的提前選取,或者離網用戶的提前預警。

搭建的環境是python3.6 +tensorflow 還有一些類庫,需要在python用pip install 類庫名稱來添加類庫。

具體用途就向上面說的,只要數據確實有一定的潛在特徵,能夠把用戶分成兩類的,即辦理OR不辦理,離網OR不離網,價值下降OR不下降等等,實際上可以理解成多個邏輯回歸的組成,因為裡面神經元也是達到閾值即輸出,不達到即不輸出。

深度學習理論上,只要數據足夠大,機器算力足夠強,可以挖掘出任何潛在的難以想像的規律。

# -*- coding: utf-8 -*-

"""

Created by sw on Wed May 2 22:18:47 2018

@author: Administrator

import numpy as np

import pandas as pd

import tensorflow as tf

import math

from sklearn.cross_validation import train_test_split

data = pd.read_table(e:/ceshi/liwang001.txt)

data = data.iloc[:,0:len(data.columns)]

data1 = (data - data.mean())/data.std()

labels = data.iloc[:,9:len(data.columns)]

#print(labels)

items = data1.iloc[:,1:len(data1.columns)]

all_data = pd.concat([pd.DataFrame(labels),items],axis = 1)

#數據集切分成訓練集和測試集,佔比為0.8:0.2

train_X,test_X,train_y,test_y = train_test_split(items,labels,test_size = 0.2,random_state = 0)

train_X = np.array(train_X)

test_X = np.array(test_X)

#這裡可以將預測結果轉換成了[0,1]或者[1,0]的對應形式,然後輸出結果即為2維output_node=2也是可以的

train_Y = np.array(train_y)

test_Y= np.array(test_y)

input_node = 9 #輸入的feature的個數,也就是input的維度

output_node = 1 #輸出的分類標籤0或者1

layer1_node = 500 #隱藏層的節點個數,一般在255-1000之間,可以自行調整

batch_size = 200 #批量訓練的數據,batch_size越小訓練時間越長,訓練效果越準確(但會存在過擬合)實際用起來確實得改好多遍

learning_rate_base = 0.8 #訓練weights的速率η

regularzation_rate = 0.0001 #正則力度

training_steps = 10000 #訓練次數,這個指標需要類似grid_search進行搜索優化 #設定之後想要被訓練的x及對應的正式結果y_

x = tf.placeholder(tf.float32,[None,input_node])

y_ = tf.placeholder(tf.float32,[None,output_node])

#input到layer1之間的線性矩陣

weight1 = tf.Variable(tf.truncated_normal([input_node,layer1_node],stddev=0.1))

#layer1到output之間的線性矩陣

weight2 = tf.Variable(tf.truncated_normal([layer1_node,output_node],stddev=0.1))

#input到layer1之間的線性矩陣的偏置

biases1 = tf.Variable(tf.constant(0.1,shape = [layer1_node]))

#layer1到output之間的線性矩陣的偏置

biases2 = tf.Variable(tf.constant(0.1,shape=[output_node]))

#正向傳播的流程,線性計算及激活函數relu的非線性計算得到result

def interence(input_tensor,weight1,weight2,biases1,biases2):

layer1 = tf.nn.relu(tf.matmul(input_tensor,weight1)+biases1)

result = tf.matmul(layer1,weight2)+biases2

return result

y = interence(x,weight1,weight2,biases1,biases2)

global_step = tf.Variable(0,trainable = False)

#交叉熵,用來衡量兩個分布之間的相似程度

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels = y_,logits=y)

cross_entropy_mean = tf.reduce_mean(cross_entropy)

#l2正則化,這塊具體我還得再多學習

regularzer = tf.contrib.layers.l2_regularizer(regularzation_rate)

regularzation = regularzer(weight1) + regularzer(weight2)

#損失函數為交叉熵+正則化

loss = cross_entropy_mean + regularzation

#我們用learning_rate_base作為速率η,來訓練梯度下降的loss函數解

train_op = tf.train.GradientDescentOptimizer(learning_rate_base).minimize(loss,global_step = global_step)

#y是我們的預測值,y_是真實值,我們來找到y_及y(比如[0.1,0.2])中最大值對應的index位置,判斷y與y_是否一致

correction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))

#如果y與y_一致則為1,否則為0,mean正好為其準確率

accurary = tf.reduce_mean(tf.cast(correction,tf.float32))

#初始化環境,設置輸入值,檢驗值

init = tf.global_variables_initializer()

sess = tf.Session()

sess.run(init)

validate_feed = {x:train_X,y_:train_Y}

test_feed = {x:test_X,y_:test_Y}

#模型訓練,每到1000次彙報一次訓練效果

for i in range(training_steps):

start = (i*batch_size)%len(train_X)

end = min(start+batch_size,16579)

xs = train_X[start:end]

ys = train_Y[start:end]

if i%1000 ==0:

validate_accuary = sess.run(accurary,feed_dict = validate_feed)

print (the times of training is %d, and the accurary is %s %(i,validate_accuary) )

sess.run(train_op,feed_dict = {x:xs,y_:ys})

推薦閱讀:

精選 | 2018年1月R新包推薦
雨沐田:數據分析7天快速入門
記錄我是如何轉型大數據分析(二)——iris
數據分析第三關,簡單數據處理
Excel數據分析常用函數大全(新人必備)

TAG:深度學習DeepLearning | 中國移動 | 數據分析 |