分享一個基於深度學習神經網路做的一個分類器
分享一個最近調試成功的基於深度學習的一個分類器,沒有用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 | 中國移動 | 數據分析 |