機器學習搞定移動數據分析

機器學習搞定移動數據分析

來自專欄移動公司數據分析

去年到今年機器學習做市場數據分析是我主要研究的方向,今天再分享一個最近剛試的一個分析。就是去判定沒簽轉不限量資費的用戶到底願不願意,或者說遷轉不限量的概率到底大不大。這塊用的時邏輯回歸,不清楚邏輯回歸的可以去百度下。有興趣的夥伴可以私信我。

首先我鎖定38和58元的套餐,88及以上我認為都應該簽轉。選取38與58里簽轉不限量的TOP2萬用戶,沒簽轉的TOP2萬用戶,4萬用戶分成兩份,一份最為訓練數據集,一份作為測試數據集。特徵數據,就是用戶的欄位數據我取了近半年的平均ARPU,DOU ,MOU,最常規的欄位,當然也可以再加上其他的。

第二步:訓練前數據必須做預處理,這裡我做了一個簡單的歸一化。就是把每個特徵,比如ARPU,把所有用戶的ARPU都除以數據里最大的ARPU值,這樣整個數據就變成了0到1之間。同樣把DOU MOU也做歸一化。為什麼要歸一化,主要是由於特徵之前數量級不同,DOU偏大,會影響訓練時的權重值修改。

第三步:數據準備好了要開始訓練了。還是老平台anaconda,這裡用到了sklearn 這個機器學習庫,裡面有上百種學習演算法,非常好用,當然邏輯回歸我是自己寫了一遍已經清楚整個過程了,這裡為了方便直接使用,最下面我會把邏輯回歸的代碼也附上,還是應該了解下具體的代碼實現。

訓練集和測試集訓練的模型最終弄下來準確率是98.78%,這塊我取數有個技巧,我們訓練機器儘可能拿非常明顯的數據餵給它,這樣才能提高模型的適應性和準確度。模稜兩可的數給了機器,它會分辨不清,導致模型不精確。

裡面的yuce數據集是應用數據,可以判定其他未簽轉不限量的用戶大概遷轉的難易程度,整體結果看了下還是非常靠譜的,這個屬於最近搞得最實用的一個了。下面貼出來原始的邏輯回歸代碼。

import numpy as np

import sklearn.model_selection

import sklearn.metrics

from sklearn.metrics import accuracy_score

class LogisticRegression:

def __init__(self):

"""初始化Logistic Regression模型"""

self.coef_ = None

self.intercept_ = None

self._theta = None

def _sigmoid(self, t):

return 1. / (1. + np.exp(-t))

def fit(self, X_train, y_train, eta=0.01, n_iters=1e4):

"""根據訓練數據集X_train, y_train, 使用梯度下降法訓練Logistic Regression模型"""

assert X_train.shape[0] == y_train.shape[0],

"the size of X_train must be equal to the size of y_train"

def J(theta, X_b, y):

y_hat = self._sigmoid(X_b.dot(theta))

try:

return - np.sum(y*np.log(y_hat) + (1-y)*np.log(1-y_hat)) / len(y)

except:

return float(inf)

def dJ(theta, X_b, y):

return X_b.T.dot(self._sigmoid(X_b.dot(theta)) - y) / len(y)

def gradient_descent(X_b, y, initial_theta, eta, n_iters=1e4, epsilon=1e-8):

theta = initial_theta

cur_iter = 0

while cur_iter < n_iters:

gradient = dJ(theta, X_b, y)

last_theta = theta

theta = theta - eta * gradient

if (abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):

break

cur_iter += 1

return theta

X_b = np.hstack([np.ones((len(X_train), 1)), X_train])

initial_theta = np.zeros(X_b.shape[1])

self._theta = gradient_descent(X_b, y_train, initial_theta, eta, n_iters)

self.intercept_ = self._theta[0]

self.coef_ = self._theta[1:]

return self

def predict_proba(self, X_predict):

"""給定待預測數據集X_predict,返回表示X_predict的結果概率向量"""

assert self.intercept_ is not None and self.coef_ is not None,

"must fit before predict!"

assert X_predict.shape[1] == len(self.coef_),

"the feature number of X_predict must be equal to X_train"

X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])

return self._sigmoid(X_b.dot(self._theta))

def predict(self, X_predict):

"""給定待預測數據集X_predict,返回表示X_predict的結果向量"""

assert self.intercept_ is not None and self.coef_ is not None,

"must fit before predict!"

assert X_predict.shape[1] == len(self.coef_),

"the feature number of X_predict must be equal to X_train"

proba = self.predict_proba(X_predict)

return np.array(proba >= 0.5, dtype=int)

def score(self, X_test, y_test):

"""根據測試數據集 X_test 和 y_test 確定當前模型的準確度"""

y_predict = self.predict(X_test)

return accuracy_score(y_test, y_predict)

def __repr__(self):

return "LogisticRegression()"

def loadData(filename):

fr = open(filename).readlines()

data = []

target = []

for line in fr:

lineArr = line.strip().split( )

data.append([float(inst) for inst in lineArr[:-1]])

target.append(float(lineArr[-1]))

return data,target

#X_train, y_train = loadData(d:/shuju/xunlian002.txt)

#X_test, y_test = loadData(d:/shuju/xunlian002.txt)

x_train = numpy.loadtxt(d:/shuju/xunlianx001.txt)

y_train = numpy.loadtxt(d:/shuju/xunliany001.txt)

clf =LogisticRegression()

clf = clf.fit(X_train, y_train)


推薦閱讀:

數據分析師必須知道的九個問題
給妹子講python-S02E14Pandas缺失值的處理
知乎大V何明科827個回答的數據分析
重走數據分析之路 R In Action
數據分析整體規劃---9周系統學習數據分析

TAG:數據分析 | 機器學習 | 中國移動 |