<jupyter_start><jupyter_text>$\alpha$ **比赛规则：*** 2018年7月15日，00:00:00-2018年7月31日，00:00:00：【晋级资格审核】* 【 晋级规则 】：我们将对初赛团队前30支团队进行资料审核，并筛选10支团队进入决赛。组委会根据比赛情况可能会有晋级调整。* 2018年8月初：【决赛】 决赛答辩，颁奖典礼；活动时间： 2018年6月5日-2018年7月15日 **解读：**本题属于分类任务，预测用户下周是否购买优惠券。输出空间为{0,1}，0表示不买，1表示买。输入空间为：1. 用户ID、用户的30个隐私信息，存放在train_agg.csv文件，(80000,31)。2. 用户的APP使用记录。80000个用户中，一部分绑定了APP，这是ta们的点击记录。存放在train_log.csv，(3533818，4)。3. 不能利用外部其它数据。这80000个用户未来一周是否会买优惠券已经被标注好了，放在train_flg.csv，(8000,2)。需要利用这些已有数据，对20000个新的用户预测，对test_agg.csv和test_log.csv进行预测，提交格式为 test_result.csv，(20000，2)。**流程：** * 度量标准：AUC* 姑且按6:2:2一次性随机划定训练集，交叉验证集，测试集。* 特征工程：大概是构建利用输入空间的34个特征来构建出更多地特征，然后在新构建出来的特征空间进行分类。  * 有句话说，算法只是逼近特征工程的上限。所以就不断的随机无脑尝试各种特征的任意组合吧。  * 但是好的算法，会自动寻找到不同特征之间的联系。比如用多元高斯分布进行异常检测，可以自动找到特征之间的线性关系。对于这个监督分类学习任务，目前想到的方法大概是：逻辑回归，线性svm，核svm，随机森林，协同过滤，各个模型集成。**key:** * 对业务数据的理解。* 对算法的理解。* 会通过学习曲线评估算法，会误差分析，总之就是知道下一步怎么做。* 动手能力。快速验证想法，好的工程溅射会使思维清晰快速。* 努力程度。一千多支队伍想稳拿前十，得在一个月内大量尝试大量尝试，至少提交200个模型？(总共才300次提交机会) 疑问：就规模而言，数据量不大，居然能放进内存。这就不必考虑很多很多其它得事情了。奖励也挺好。接触ml已经有两个多月了。就学习进度上，是太慢了，主要是没有花费预想得足够多的时间。但是也有一些疑问。看过好些人的讨论，说是只会调用sklearn,tensorflow,numpy,等其它包不叫搞机器学习，看prml，西瓜书，推公式，也不叫机器学习，听公开课也不叫机器学习，真正的ml/dl只有ai专业出身的才算。也确实觉得，真正的工程项目，比如要部署在几百台机器上的数据，比如online模型，比如用C++把sklearn/tensorflow/pytorch的包重写一遍，这些硬工程能力很重要。但是既然招商银行说top10就可以给最终面试资格，而这个比赛，确实可以在普通PC上用4GB内存和i3处理器完成，就硬件来说连GPU都不需要。那么就一定要试一下 :)  加载数据：提交格式：<jupyter_code>submit_sample = pd.read_csv('submit_sample.csv',sep='\t')
print(submit_sample.shape)
submit_sample.head(5)<jupyter_output>(20000, 2)<jupyter_text>包含80000名信用卡客户的个人属性与信用卡消费数据，其中包含枚举型特征和数值型特征，均已转为数值并进行了脱敏和标准化处理。**个人属性与信用卡消费数据：**<jupyter_code>train_agg = pd.read_csv('train_agg.csv',sep='\t')
print(train_agg.shape)
train_agg.head(5)
train_agg.describe()<jupyter_output><empty_output><jupyter_text>上述信用卡客户(80000名)中，部分已绑定掌上生活APP的客户，在近一个月时间窗口内的所有点击行为日志。日志记录包含如下字段。**APP操作行为日志：**<jupyter_code>train_log = pd.read_csv('train_log.csv',sep='\t')
print(train_log.shape)
train_log.head(5)<jupyter_output>(3533818, 4)<jupyter_text>EVT_LBL:点击模块名称，点击模块名称均为数字编码（形如231-145-18），代表了点击模块的三个级别。（如饭票-代金券-门店详情）OCC_TIM:触发时间，用户触发该事件的精确时间。TCH_TYP:事件类型，0:APP,1:WEB,2:H5<jupyter_code>train_log.describe()
train_log['TCH_TYP'].mean()<jupyter_output><empty_output><jupyter_text>包括客户号及标签。其中，标签数据为用户是否会在未来一周，购买掌上生活APP上的优惠券。1表示购买，0表示未购买。**标注数据：**<jupyter_code>train_flg = pd.read_csv('train_flg.csv',sep='\t')
print(train_flg.shape)
train_flg.head(5)
train_flg.describe()
test_agg = pd.read_csv('test_agg.csv',sep='\t')
print(test_agg.shape)
test_agg.head(5)
test_agg.describe()
test_log = pd.read_csv('test_log.csv',sep='\t')
print(test_log.shape)
test_log.head(5)
test_log.describe()
print(train_agg.shape)# 个人属性与信用卡消费数据。
print(train_log.shape)# APP操作行为日志,带用户ID，远大于用户数量，因为一个用户不只使用一次。
print(train_flg.shape)# 标注数据，标注某用户ID在未来一周是否买优惠券。
print(test_agg.shape)# 测试数据，个人属性与信用卡消费数据。
print(test_log.shape)# 测试数据，APP操作行为日志。
print(submit_sample.shape)<jupyter_output>(80000, 31)
(3533818, 4)
(80000, 2)
(20000, 31)
(891414, 4)
(20000, 2)<jupyter_text>画图查看数据内部结构和关系：<jupyter_code>np.arange(1,80001).sum()
# 太奇怪了！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！
train_agg['USRID'].sum()
train_agg.ffill(0)
train_agg.describe()<jupyter_output><empty_output><jupyter_text>构建训练集，交叉验证集，测试集：<jupyter_code>from sklearn import linear_model, datasets, svm
train_agg = pd.read_csv('train_agg.csv',sep='\t')
train_log = pd.read_csv('train_log.csv',sep='\t')
train_flg = pd.read_csv('train_flg.csv',sep='\t')
test_agg = pd.read_csv('test_agg.csv',sep='\t')
test_log = pd.read_csv('test_log.csv',sep='\t')
print(train_agg.shape)# 个人属性与信用卡消费数据。
print(train_log.shape)# APP操作行为日志,带用户ID，远大于用户数量，因为一个用户不只使用一次。
print(train_flg.shape)# 标注数据，标注某用户ID在未来一周是否买优惠券。
print(test_agg.shape)# 测试数据，个人属性与信用卡消费数据。
print(test_log.shape)# 测试数据，APP操作行为日志。
print(submit_sample.shape)
train_agg.index = train_agg['USRID']
train_log.index = train_log['USRID']
train_flg.index = train_flg['USRID']
test_agg.index = test_agg['USRID']
test_log.index = test_log['USRID']
train_agg.columns.name = 'feature'
train_log.columns.name = 'feature'
train_flg.columns.name = 'feature'
test_agg.columns.name = 'feature'
test_agg.columns.name = 'feature'

del train_agg['USRID']
del train_log['USRID']
del train_flg['USRID']
del test_agg['USRID']
del test_log['USRID']
train_agg.head()
who = pd.DataFrame(0*train_agg.index, index = train_agg.index, columns=['whopoint'])
whopoint = np.unique((train_log.index.values))
who.loc[whopoint] = 1
train_agg['whopoint'] = who.fillna(0)
train_agg['flag'] = train_flg
train_agg
train_agg.columns[0:31]
x = train_agg[train_agg.columns[0:31]].values
y = train_agg[train_agg.columns[31]].values
print(x[:,30].mean())
print(train_agg['whopoint'].mean())
print(y.mean())
x_train = x[0:60000]
x_test = x[60000:80000]
x_train.shape
y_train = y[0:60000]
y_test = y[60000:80000]
y_train.shape
clf = linear_model.LogisticRegression(n_jobs=1,class_weight={1:25,0:1})
clf
clf.fit(x_train, y_train)
print(clf.score(x_train, y_train))
print(clf.score(x_test, y_test))
def sigma(x):
    return 1/(1 + np.exp(-x))<jupyter_output><empty_output><jupyter_text>**计算AUC：**<jupyter_code>z = np.dot(x_train, clf.coef_.T) + clf.intercept_
print(z.shape)
dataframe = pd.DataFrame(y_train, columns=['ytrue'])
dataframe['sigmaz'] = sigma(z)
dataframe.head()
# ytrain一栏，来自数据y_train，sigmaz一栏，来自分类器clf预测的概率值，clf的x_train用户ID和y_train一致可以直接并列。
sortbyprobability = dataframe.sort_values(by='sigmaz', ascending=False)['ytrue'].values
# 按sigmaz一栏从大到小排序，再取出排序之后的ytrain值
step = 100
# 按sigmaz排序后，
# 第一次认为前600个概率对应的用户ID会购买优惠卷，预测值存放在wethinktrue变量。
# 第二次认为前1200个概率对应的用户ID会购买优惠卷，预测值存放在wethinktrue变量。
searchrange = np.arange(0,len(y_train),step)
number = np.arange(len(searchrange))
# searchrange.shape
cache = np.arange(2*len(searchrange)).reshape(-1,2)
cache = cache * 0.0
print(cache.shape)
search = np.hstack(( number.reshape(-1,1), searchrange.reshape(-1,1) ))
print(search.shape)
wethinktrue = np.array([0] * len(y_train), dtype='int64')
for choicenumber in search:
#     print(choicenumber)
    wethinktrue[0:choicenumber[1]] = 1
    TP = ((wethinktrue == 1 ) & (sortbyprobability == 1)).sum()
    FP = ((wethinktrue == 1 ) & (sortbyprobability == 0)).sum()
    FN = ((wethinktrue == 0 ) & (sortbyprobability == 1)).sum()
    TN = ((wethinktrue == 0 ) & (sortbyprobability == 0)).sum()
    FPR = FP/( TN +FP )
    TPR = TP/( TP + FN )
    cache[choicenumber[0]] = [FPR, TPR]
#     print(cache[choicenumber])
    
plt.plot(cache[:,0], cache[:,1], 'ro',markersize=0.5)
plt.show()
print('auc: ',end='')
print(np.diff(cache[:,0]).dot(cache[1:,1]))<jupyter_output><empty_output><jupyter_text>**对测试集的效果：**<jupyter_code>z = np.dot(x_test, clf.coef_.T) + clf.intercept_
print(z.shape)
dataframe = pd.DataFrame(y_test, columns=['ytrue'])
dataframe['sigmaz'] = sigma(z)
dataframe.head()
dataframe.count()
sortbyprobability = dataframe.sort_values(by='sigmaz', ascending=False)['ytrue'].values
# 按sigmaz一栏从大到小排序，再取出排序之后的ytrain值
step = 100
# 按sigmaz排序后，
# 第一次认为前600个概率对应的用户ID会购买优惠卷，预测值存放在wethinktrue变量。
# 第二次认为前1200个概率对应的用户ID会购买优惠卷，预测值存放在wethinktrue变量。
searchrange = np.arange(0,len(y_test),step)
number = np.arange(len(searchrange))
# searchrange.shape
cache = np.arange(2*len(searchrange)).reshape(-1,2)
cache = cache * 0.0
print(cache.shape)
search = np.hstack(( number.reshape(-1,1), searchrange.reshape(-1,1) ))
print(search.shape)
wethinktrue = np.array([0] * len(y_test), dtype='int64')
for choicenumber in search:
#     print(choicenumber)
    wethinktrue[0:choicenumber[1]] = 1
    TP = ((wethinktrue == 1 ) & (sortbyprobability == 1)).sum()
    FP = ((wethinktrue == 1 ) & (sortbyprobability == 0)).sum()
    FN = ((wethinktrue == 0 ) & (sortbyprobability == 1)).sum()
    TN = ((wethinktrue == 0 ) & (sortbyprobability == 0)).sum()
    FPR = FP/( TN +FP )
    TPR = TP/( TP + FN )
    cache[choicenumber[0]] = [FPR, TPR]
#     print(cache[choicenumber])
plt.plot(cache[:,0], cache[:,1], 'ro',markersize=0.5)
plt.show()
print('auc: ',end='')
print(np.diff(cache[:,0]).dot(cache[1:,1]))<jupyter_output><empty_output><jupyter_text>http://scikit-learn.org/stable/modules/generated/sklearn.utils.class_weight.compute_sample_weight.htmlhttp://scikit-learn.org/stable/auto_examples/svm/plot_separating_hyperplane_unbalanced.html  提交的答案<jupyter_code>who = pd.DataFrame(0*test_agg.index, index = test_agg.index, columns=['whopoint'])
whopoint = np.unique((test_log.index.values))
who.loc[whopoint] = 1
test_agg['whopoint'] = who.fillna(0)
test_agg['flag'] = 0
test_agg.head()
submitx = test_agg[train_agg.columns[0:31]].values
submitx.shape
submitx[:,30].mean()
z = np.dot(submitx, clf.coef_.T) + clf.intercept_
submity = sigma(z)
submity.shape
submity
test_agg['flag'] = submity
test_agg['flag']
test_agg['flag'].to_csv('test_result.csv',sep='\t',index=True,header=False)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.17782593817725562, 'fraction_numerical': 0.04003650051328847, 'mean_word_length': 9.07816091954023, 'pattern_counts': {'":': 0, '<': 38, '<?xml version=': 0, '>': 38, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '230268', 'license': 'MIT', 'n_tokens_mistral': 4938, 'n_tokens_neox': 5151, 'n_words': 384, 'path': 'bisai/zhaoshangbank/vv.ipynb', 'repo_name': 'bluove/-', 'size': '8767'}