机器学习搞定移动数据分析

机器学习搞定移动数据分析

去年到今年机器学习做市场数据分析是我主要研究的方向,今天再分享一个最近刚试的一个分析。就是去判定没签转不限量资费的用户到底愿不愿意,或者说迁转不限量的概率到底大不大。这块用的时逻辑回归,不清楚逻辑回归的可以去百度下。有兴趣的伙伴可以私信我。

首先我锁定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('\t')

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)

发布于 2018-07-11

文章被以下专栏收录

    在不泄露公司经营数据的前提下,分享移动公司市场分析方面的分析经验、分析结果。以及利用R/PYTHON/深度学习等数据挖掘技术在运营商市场分析方面的应用经验。