个性化聚类推荐Kmeans实战

个性化聚类推荐Kmeans实战_第1张图片
与内容无关

数据预处理

1. 去除不需要的数据

目标是:一个用户,后面全是用户的特征

  • 列数据中 Null 数据 > 80% 所有数据 isnull().sum()
  • 列数据中一样的数据 > 80%所有数据 value_counts()
  • 表示同一个意思的字段,只需要保留一个:如用户名、用户账号、支付账号、收货人姓名
  • 根据场景分析不需要的字段:如买家应付货款、应付邮费等

2. 只获取指定的列数据

df_order.ix[:, '订单编号', '买家会员名', '买家实际支付金额', '收货地址', '种类', '数量', '退款金额']
# ix是loc与iloc的合集,其中loc是按照列名来取数据,iloc是按照列的index来取数据

或者

df_order[['订单编号', '买家会员名', '买家实际支付金额', '收货地址', '种类', '数量', '退款金额']]

3. 对数据进行格式化

df_order['收货地址'] = df_order['收货地址'].apply(lambda x:x.split()[0])

4. 按照某列数据给整行数据打tag

def add_tag(info):
  if '月' in info:
    tag = '婴儿|'
  if '':
    tag = '幼儿|'
  if:
    tag = '学生|'
  return tag[:-1]
attrs['tag'] = attrs['适用年龄'].apply(add_tag)

5. 数据合并

pd.merge(items, attrs, on='标题', how='inner')

6. 对每个用户进行分组汇总

order_tag['购买次数'] = 1
test2 = order_tag.groupby(['买家会员名', 'tag2']).count()
test2.unstack('tag2').fillna(0) # unstack将会把索引数据中的一列转为列名

7. 对重复的数据取平均值

res1 = res1.groupby(['会员', '地址']).mean()
res1.reset_index(inplace=True)

8. 将字符串转为数值的方法有两种:

  1. 用数值表示具体值,如:好、一般、差就用相关数值表示
  2. unstack将它转为column,或者get_dummies方法将非数值型转为column
pd.get_dummies?
result2= pd.get_dummies(res1) ##只会对非数值型有效

最后得到的数据:

       买家实际支付金额  宝贝种类  宝贝总数量  退款金额  收货地址_上海  收货地址_云南省  收货地址_内蒙古自治区  收货地址_北京  \
买家会员名                                                                         
409       35.31     8     11   0.0        0         0            0        0   
2270      13.70     1      3   0.0        0         0            0        0   
1908      55.09     7      7   0.0        0         0            0        0   
1727      62.72    11     14   0.0        1         0            0        0   
1976      18.80     1      2   0.0        0         1            0        0   

       收货地址_吉林省  收货地址_四川省    ...      收货地址_湖北省  收货地址_湖南省  收货地址_甘肃省  收货地址_福建省  \
买家会员名                        ...                                               
409           0         0    ...             0         0         0         0   
2270          0         0    ...             0         0         0         0   
1908          0         0    ...             0         0         0         0   
1727          0         0    ...             0         0         0         0   
1976          0         0    ...             0         0         0         0   

       收货地址_贵州省  收货地址_辽宁省  收货地址_重庆  收货地址_陕西省  收货地址_青海省  收货地址_黑龙江省  
买家会员名                                                              
409           0         0        0         0         0          0  
2270          0         0        0         0         0          0  
1908          0         0        0         0         0          0  
1727          0         0        0         0         0          0  
1976          0         0        0         0         0          0  

基于用户聚类

目标:对用户进行标记分类

1. 数据标准化

from sklearn.preprocessing import MinMaxScaler
data = order_df.ix[:,1:].values  #去掉第一列数据,也就是用户id
mms=MinMaxScaler()
data_nore = mms.fit_transform(data)
print(data_nore)

2. 聚类

- 手肘法
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt
sse = []
for k in range(1,15):
    km = KMeans(n_clusters=k)
    km.fit(data_nore)
    sse.append(km.inertia_)
x = range(1, 15)
y = sse
plt.plot(x,y)
plt.show()

- 轮廓法
from sklearn.metrics import silhouette_score
score = []
for k in range(2, 15):
    km=KMeans(n_clusters=k)
    res_km = km.fit(data_nore)
    score.append(silhouette_score(data_nore, res_km.labels_))
plt.plot(range(2, 15), score, marker='o')

#根据上面的值取得最优n_clusters值,例如为8
from sklearn.cluster import KMeans
km=KMeans(n_clusters=8)
res_km = km.fit(data_nore)
km.labels_ # 这个就是聚类结果,也是最终需要的结果

3. 将类别添加到分析数据中

result2['类别'] = km.labels_ #对原始用户进行类别标记

基于用户聚类进行推荐

目标:向用户推荐产品

同一类群中,大多数人喜欢的商品,用户也喜欢

order_df['商品购买次数'] = 1
data = order_df.groupby(['类别','商品'].count()) #不同类别人对商品的关注程度
data.reset_index(inplace=True)
print(data.ix[:, ['类别','商品', '商品购买次数']]) #得到类别->商品->购买次数

推荐给用户同一个类别,而没有购买过的商品,按照购买次数排序推荐。

基础知识

pandas.DataFrame基本方法

df.info() #查看数据信息
df.shape #获得数据行列数
del(df['a']) #删除某列数据
df['col'].values #查看数据
df.columns #查看列名
df.reset_index(inplace=True) #重置索引
df.index = df['index'] #创建索引
df = df.set_index('index') #将某列设置为索引

df合并

merged_df = left_df.merge(right_df, how="left", left_on=u'主机配置', right_on=u'主机说明')

根据某条数据的属性添加新的数据列

df['b'] = 0
df['b'][df['a']==1] = 8 ##注意先选完整的列,再过滤才能赋值

读取文件时,默认是utf8格式,也可以指定编码

常见的编码方式有:ascii/utf8/unicode/utf-16/gb2312/gbk/gb18030

pd.read_csv('file_path.csv', encoding='gb2312')

将一列数据转为多列数据

df = pd.DataFrame([{"a": 1, "name":"1|2|4"}, {"a": 2, "name":"1|5|9"}])
df[["b", "c", "d"]] = df['name'].str.split('|', expand=True)  # 多名字分列
# 或者
df = df.join(df['name'].str.split('|', expand=True))

result:
   a   name  b  c  d
0  1  1|2|4  1  2  4
1  2  1|5|9  1  5  9

将DataFrame中的tuple分割成数据框的多列

df = pd.DataFrame({'a':[1,2], 'b':[(1,2), (3,4)]})
df[['b1', 'b2']] = df['b'].apply(pd.Series)
# 或者
df = df.join(df['b'].apply(pd.Series))

result:
     a       b  0  1
0  1  (1, 2)  1  2
1  2  (3, 4)  3  4

stack与unstack使用说明:python pandas stack和unstack函数

利用当前数据的多列数据得到新的数据列

df['new_column'] = df.apply(lambda row: row['column1'] * row['column2'], axis=1)
# 或者
df['new_column']  = df['column1'] * df['column2']
# 或者
df.ix[:, 'new_column'] = df['column1'] * df['column2']

得到类型中有关系数据库的数据

df[df[u'类型'].str.contains(u'关系数据库')]

apply函数返回多列数据

def parse(item):
    return pd.Series([item*2, item*4])

a = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
a[['2倍', '4倍']] = a['a'].apply(parse)

result:
   a  b  2倍  4倍
0  1  4   2   4
1  2  5   4   8
2  3  6   6  12

过滤逻辑类型

np.logical_and

data = df[np.logical_and(df['col1'].notnull(), df['col1'].str.contains('item'))]

更改列名

data = df.rename(columns={'col1': u'列1', 'col2': u'列2'})

将数据转化为常用类型

col1_data = df['col1'].tolist()

你可能感兴趣的:(个性化聚类推荐Kmeans实战)