机器学习算法竞赛实战(四)

用户画像

什么是用户画像

在机器学习中提到的用户画像通常是基于给定的数据对用户属性以及行为进行描述,然后提取用户的个性化指标,再以此分析可能存在的群体共性,并落地应用到各种业务场景中。

标签系统

标签分类方式

  • 用户属性
  • 用户标签
  • 标签属性
  • 类目标签

多渠道获取标签

  • 事实类标签
  • 规则类标签
  • 模型类标签

用户画像数据特征

常见的数据形式

  • 数值型变量。年龄,身高,体重等。
  • 类别型变量。性别,籍贯,所在城市等。
  • 多值型变量。兴趣爱好,穿衣风格等
  • 文本型变量。

文本挖掘算法

  • LSA
  • PLSA
  • LDA

相似度计算方法

  • 欧式距离 \[ d(A, B) = \sqrt{\sum_{i=1}^n{(a_i,b_i)^2}} \]

  • 余弦相似度 \[ \cos\theta=\frac{\sum_{i=1}^{n}{(a_i*b_i)}}{\sqrt{\sum_{i=1}^{n}a_i^2}*\sqrt{\sum_{i=1}^{n}b_i^2}} \]

  • Jaccard相似度 \[ J(C,D)=\frac{|C\bigcap{D}|}{|C\bigcup{D}|}=\frac{|C\bigcap{D}|}{|C|+|D|-|C\bigcap{D}|} \]

实战案例:Elo Merchant Category Recommendtion

Elo Merchant Category Recommendation | Kaggle

赛题理解

赛题背景

Elo是巴西最大的支付品牌,Elo建立了机器学习模型,以了解顾客生命周期中从视频到购物等最重要方面的偏好。

赛题数据

  • train.csv:训练集
  • test.csv:测试集
  • sample_submission.csv:正确与规范的提交文件示例
  • historical_transactions.csv:信用卡的历史交易记录
  • merchants.csv:数据集中所有商家的附加信息
  • new_merchant_transactions.csv:每张信用卡在新商家的购物数据,最多包含两个月的数据
  • Data_Dictionary.xlsx:数据字典的说明文件

赛题任务

通过顾客的历史交易记录以及顾客和商家的信息数据进行模型训练,最终预测测试集里面所有信用卡的忠诚度分数。

评价指标

本次竞赛采用均方根误差(RMSE)作为评价指标\(RMSE=\sqrt{\frac{1}{n}\sum_{i=1}^{n}{(y_i-y_i')^2}}\)

其中\(y_i'\)是参赛者对每个信用卡预测的忠诚度分数,而\(y_i\)是对应信用卡的真实忠诚度分数。

数据探索

"Talk is cheap,show me the data."

字段类别含义

1
2
3
4
# 查看训练集与测试集字段的含义
df = pd.read_excel(datapath+'Data_Dictionary.xlsx', sheet_name='train', skiprows=2)
for va in df.values:
print('Column:', va[0], 'Description:', va[1])
1
2
3
4
# 查看history_transactions.csv字段的含义
df2 = pd.read_excel(datapath+'Data_Dictionary.xlsx', sheet_name='history', skiprows=2)
for va in df.values:
print('Column:', va[0], 'Description:', va[1])

数据分布差异

1
2
3
4
5
6
7
8
9
10
11
12
# 以first_active_month为例分析训练集与测试集的差异
features = ['first_active_month','feature_1','feature_2','feature_3']
train_count = train.shape[0]
test_count = test.shape[0]
for feature in features:
train[feature].value_counts().sort_index().plot()
test[feature].value_counts().sort_index().plot()
plt.xlabel(feature)
plt.legend(['train','test'])
plt.ylabel('count')
plt.show()
#结论:训练集与测试集在所有单变量上的绝对数量分布形状极其相似,需要进一步查看相对占比分布
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 以first_active_month为例分析训练集与测试集的差异
features = ['first_active_month','feature_1','feature_2','feature_3']
train_count = train.shape[0]
test_count = test.shape[0]
for feature in features:
(train[feature].value_counts().sort_index()/train_count).plot()
(test[feature].value_counts().sort_index()/test_count).plot()
plt.legend(['train','test'])
plt.xlabel(feature)
plt.ylabel('ratio')
plt.show()


#结论:训练集与测试集在所有单变量上的相对占比分布形状基本一致,猜想训练集与测试集的生成方式
# 一样,继续验证联合分布以加强猜想的事实依据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 为了查看多变量的联合分布,通常来说可以使用散点图,但这里的四个特征均是离散特征,因此散点图不太适合
# 继续延续上面画单变量图的思想,参赛者可以通过将两个变量拼到一起转变为单变量的分布
def combine_feature(df):
cols = df.columns
feature1 = df[cols[0]].astype(str).values.tolist()
feature2 = df[cols[1]].astype(str).values.tolist()
return pd.Series([feature1[i]+'&'+feature2[i] for i in range(df.shape[0])])
n = len(features)
for i in range(n-1):
for j in range(i+1, n):
cols = [features[i], features[j]]
print(cols)
train_dis = combine_feature(train[cols]).value_counts().sort_index()/train_count
test_dis = combine_feature(test[cols]).value_counts().sort_index()/test_count
index_dis = pd.Series(train_dis.index.tolist() + test_dis.index.tolist()).drop_duplicates().sort_values()
(index_dis.map(train_dis).fillna(0)).plot()
(index_dis.map(train_dis).fillna(0)).plot()
plt.legend(['train','test'])
plt.xlabel('&'.join(cols))
plt.ylabel('ratio')
plt.show()
# 结论:修正上述遗漏后参赛者可以发现训练集与测试集的两变量联合分布也基本保持一致,由此基本可以判定,训练集与测似集
# 的生成方式基本一摸一样,即测试集与训练集是同一批数据随机划分后的结果,有兴趣的参赛者可继续验证三变量和四变量分布。假定
# 关于验证集与测试集的这一猜想成立,会极大地增添参赛者后续进行特征工程的信心,对建模方式也会有一个整体把握。

机器学习算法竞赛实战(四)
https://www.spacezxy.top/2021/10/23/ML-Pratice/ML-Algorithm-pratice-4/
作者
Xavier ZXY
发布于
2021年10月23日
许可协议