機器學習搞定移動數據分析
來自專欄移動公司數據分析
去年到今年機器學習做市場數據分析是我主要研究的方向,今天再分享一個最近剛試的一個分析。就是去判定沒簽轉不限量資費的用戶到底願不願意,或者說遷轉不限量的概率到底大不大。這塊用的時邏輯回歸,不清楚邏輯回歸的可以去百度下。有興趣的夥伴可以私信我。
首先我鎖定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周系統學習數據分析