抖音用户浏览行为数据分析与挖掘

news2024/10/7 10:22:44

下文部分代码省略,完整项目代码及数据集链接:抖音用户浏览行为数据分析与挖掘

目录

  • 1.特征指标构建
    • 0. 项目介绍与说明
      • **数据集说明**
      • 浏览行为
    • 1. 数据简单处理
    • 2. 特征指标构建
      • 用户指标分析:
      • 作者指标分析:
      • 作品指标分析:
    • 3. 特征指标统计分析
      • 3.1 用户特征统计分析
      • 3.2 作者特征统计分析
      • 3.3 作品特征统计分析
      • 4. 总结
  • 2.数据可视化分析
    • 0. 绘图函数封装
    • 1. 用户特征分析
      • 1.0 特征数据统计
      • 1.1 用户浏览情况
      • 1.2 用户点赞情况
      • 1.3 用户完整观看情况
      • 1.4 用户观看作品的平均完整时长分布
      • 1.5 用户去过的城市数分布
    • 2 作者特征分析
      • 2.0 数据指标统计
      • 2.1 作者浏览情况
      • 2.2 作者点赞情况
      • 2.3 作者去过的城市数
    • 3. 作品特征分析
      • 3.0 数据读取
      • 3.1 作品各日发布情况
      • 3.2 作品浏览量情况
      • 3.3 作品点量率情况
  • 3. 数据挖掘探索
    • 3.1 聚类分析
    • 1. 数据读取与数据处理
      • 1.1 数据读取
      • 1.2 数据处理
    • 2. 聚类方法与定义
      • 2.1 聚类方法
      • 2.2 相关函数定义
    • 3. 用户特征聚类
      • 3.1 模型训练与保存
      • 3.2 聚类k值选择
      • 3.3 聚类结果
    • 4. 作者特征聚类
      • 4.1 模型训练与保存
      • 4.2 聚类k值选择
      • 4.3 聚类效果
    • 总结
    • 3.2 二分类预测
    • 1. 数据读取与处理
      • 1.1 数据读取
      • 1.2 数据抽样处理
      • 1.3 时间数据处理
      • 1.4 数据集划分
    • 2. 模型预训练
      • 2.1 模型训练函数
      • 2.2 模型训练
      • 2.3 模型AUC曲线
    • 3. 模型优化
      • 3.1 n_e优化
      • 3.2 max_f优化
      • 3.3 模型训练
    • 4. 模型预测
      • 4.1 模型准确率
      • 4.2 一些说明

1.特征指标构建

0. 项目介绍与说明

数据集说明

字段名释义字段名释义字段名释义
uid用户iduser_city用户城市item_id作品id
author_id作者iditem_city作者城市channel作品频道
finish是否看完like是否点赞music_id音乐id
duration_time作品时长real_time具体发布时间H、date时、天(发布)

浏览行为

每一条数据都是由用户主动发起的,与创作者视频进行交互的行为记录,包括

  • 什么人(用户)
  • 看了谁的(作者)
  • 什么视频(作品、发布时间、音乐、时长)
  • 什么渠道
  • 是否看完
  • 是否点赞
  • 音乐和时间等

我们可以将浏览行为的数据简单的分类为:

  1. 用户信息: u i d , u s e r _ c i t y uid,user\_city uiduser_city
  2. 作品信息: i t e m _ i d , i t e m _ c i t y , c h a n n e l , m u s i c i d , d u r a t i o n _ t i m e , r e a l _ t i m e , H 、 d a t e item\_id, item\_city, channel, music_id, duration\_time, real\_time, H、date item_id,item_city,channel,musicid,duration_time,real_time,Hdate
  3. 作者信息: a u t h o r i d author_id authorid
  4. 浏览行为描述: f i n i s h , l i k e finish, like finish,like

同时可以从浏览行为中抽象出:用户、作品、作者、音乐、城市等实体,在本项目中,我们仅对用户、作者和作品角度进行简单分析,并加入一些数据分析方法

import pandas as pd
import numpy as np

1. 数据简单处理

df = pd.read_csv('/home/mw/input/somnus8660/douyin_dataset.csv')
df.head()
Unnamed: 0uiduser_cityitem_idauthor_iditem_citychannelfinishlikemusic_idduration_timereal_timeHdate
0315692109.069166118212213.000011513.0102019-10-28 21:55:10212019-10-28
154407180.012432123450068.00001274.092019-10-21 22:27:03222019-10-21
21610902202.03845855634066113.0000762.0102019-10-26 00:38:5102019-10-26
3192530021.03929579214923330.00002332.0152019-10-25 20:36:25202019-10-25
4243656138.0257226918268080.0000238.092019-10-21 20:46:29202019-10-21

无效字段的删除[Unnamed:0]

del df['Unnamed: 0']
# 数据基本信息基本信息
df.info(null_counts = True)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1737312 entries, 0 to 1737311
Data columns (total 13 columns):
uid              1737312 non-null int64
user_city        1737312 non-null float64
item_id          1737312 non-null int64
author_id        1737312 non-null int64
item_city        1737312 non-null float64
channel          1737312 non-null int64
finish           1737312 non-null int64
like             1737312 non-null int64
music_id         1737312 non-null float64
duration_time    1737312 non-null int64
real_time        1737312 non-null object
H                1737312 non-null int64
date             1737312 non-null object
dtypes: float64(3), int64(8), object(2)
memory usage: 172.3+ MB

数据无空缺

2. 特征指标构建

用户指标分析:

站在用户的角度,涉及到浏览量,点赞量,浏览的作品、作者、BGM的总数等,拟定统计指标如下:

Image Name

作者指标分析:

站在作者的角度,涉及到总浏览量,总点赞量等,拟定指标如下:

Image Name

作品指标分析:

站在作品的角度,简单分析,拟定统计指标如下:

Image Name

3. 特征指标统计分析

3.1 用户特征统计分析

user_df = pd.DataFrame()
user_df['uid'] = df.groupby('uid')['like'].count().index.tolist() # 将所有用户的uid提取为uid列
user_df.set_index('uid', inplace=True) # 设置uid列为index,方便后续数据自动对齐
user_df['浏览量'] = df.groupby('uid')['like'].count() # 统计对应uid下的浏览量
user_df['点赞量']  = df.groupby('uid')['like'].sum() # 统计对应uid下的点赞量
user_df['观看作者数'] = df.groupby(['uid']).agg({'author_id':pd.Series.nunique}) # 观看作者数
user_df['观看作品数'] = df.groupby(['uid']).agg({'item_id':pd.Series.nunique}) # 观看作品数
user_df['观看作品平均时长'] = df.groupby(['uid'])['duration_time'].mean() # 浏览作品平均时长
user_df['观看配乐数'] = df.groupby(['uid']).agg({'music_id':pd.Series.nunique}) # 观看作品中配乐的数量
user_df['完整观看数']  = df.groupby('uid')['finish'].sum() # 统计对应uid下的完整观看数
# 统计对应uid用户去过的城市数量
user_df['去过的城市数'] = df.groupby(['uid']).agg({'user_city':pd.Series.nunique})
# 统计对应uid用户看的作品所在的城市数量
user_df['观看作品城市数'] = df.groupby(['uid']).agg({'item_city':pd.Series.nunique})
user_df.describe()

user_df.to_csv('用户特征.csv', encoding='utf_8_sig')

3.2 作者特征统计分析

author_df = pd.DataFrame()
author_df['author_id'] = df.groupby('author_id')['like'].count().index.tolist()
author_df.set_index('author_id', inplace=True)
author_df['总浏览量'] = df.groupby('author_id')['like'].count()
author_df['总点赞量']  = df.groupby('author_id')['like'].sum()
author_df['总观完量']  = df.groupby('author_id')['finish'].sum()
author_df['总作品数'] = df.groupby('author_id').agg({'item_id':pd.Series.nunique})

item_time = df.groupby(['author_id', 'item_id']).mean().reset_index()
author_df['作品平均时长'] = item_time.groupby('author_id')['duration_time'].mean()

author_df['使用配乐数量'] = df.groupby('author_id').agg({'music_id':pd.Series.nunique})
author_df['发布作品日数'] = df.groupby('author_id').agg({'real_time':pd.Series.nunique})

# pd.to_datetime(df['date'].max()) - pd.to_datetime(df['date'].min()) # 作品时间跨度为40,共计40天
author_days = df.groupby('author_id')['date']
_ = pd.to_datetime(author_days.max()) - pd.to_datetime(author_days.min())
author_df['创作活跃度(日)'] = _.astype('timedelta64[D]').astype(int) + 1
author_df['去过的城市数'] = df.groupby(['author_id']).agg({'item_city':pd.Series.nunique})
author_df.describe()

author_df.to_csv('作者特征.csv', encoding='utf_8_sig')

3.3 作品特征统计分析

item_df = pd.DataFrame()
item_df['item_id'] = df.groupby('item_id')['like'].count().index.tolist()
item_df.set_index('item_id', inplace=True)
item_df['浏览量'] = df.groupby('item_id')['like'].count()
item_df['点赞量']  = df.groupby('item_id')['like'].sum()
item_df['发布城市'] = df.groupby('item_id')['item_city'].mean()
item_df['背景音乐'] = df.groupby('item_id')['music_id'].mean()

item_df.to_csv('作品特征.csv', encoding='utf_8_sig')

4. 总结

通过对浏览行为数据的认识和分析,构建并提取了用户、作者、作品的特征,特征的构造和提取并不唯一,如可以统计用户点赞率、作者的观众数等等

2.数据可视化分析

0. 绘图函数封装

1. 用户特征分析

1.0 特征数据统计

1.1 用户浏览情况

在这里插入图片描述
绘制类似二八分布的浏览量分布曲线:

  1. 按照浏览量从大到小将用户排序
  2. 依次计算前n个用户的浏览量之和占所有用户浏览量的比例
  3. 将人数n和前n人浏览量之和占总体比例绘制为图像
    在这里插入图片描述

1.2 用户点赞情况

在这里插入图片描述
按照点赞量从大到小排序并求和,绘制类似二八分布的曲线
在这里插入图片描述
0.0% 的用户点了 0% 的赞
0.0% 的用户点了10% 的赞
0.1% 的用户点了20% 的赞
0.3% 的用户点了30% 的赞
0.5% 的用户点了40% 的赞
0.8% 的用户点了50% 的赞
1.3% 的用户点了60% 的赞
2.2% 的用户点了70% 的赞
3.5% 的用户点了80% 的赞
5.8% 的用户点了90% 的赞

1.3 用户完整观看情况

在这里插入图片描述

1.4 用户观看作品的平均完整时长分布

在这里插入图片描述

1.5 用户去过的城市数分布

在这里插入图片描述

2 作者特征分析

2.0 数据指标统计

2.1 作者浏览情况

在这里插入图片描述
同样绘制浏览量的二八分布曲线(原理参考用户特征分析相同位置),受到一些奇怪条件,只加载头部(累计达到90%浏览量的用户数)
在这里插入图片描述

2.2 作者点赞情况

在这里插入图片描述
同样绘制浏览量的二八分布曲线(原理参考用户特征分析相同位置),受到一些奇怪条件,只加载头部(累计达到99%总点赞量的用户数)
在这里插入图片描述

0.0% 的作者获得了 0% 的赞
0.1% 的作者获得了10% 的赞
0.2% 的作者获得了20% 的赞
0.4% 的作者获得了30% 的赞
0.7% 的作者获得了40% 的赞
1.1% 的作者获得了50% 的赞
1.8% 的作者获得了60% 的赞
2.6% 的作者获得了70% 的赞
3.4% 的作者获得了80% 的赞
4.2% 的作者获得了90% 的赞

2.3 作者去过的城市数

在这里插入图片描述

3. 作品特征分析

3.0 数据读取

3.1 作品各日发布情况

在这里插入图片描述

3.2 作品浏览量情况

在这里插入图片描述

3.3 作品点量率情况

在这里插入图片描述

3. 数据挖掘探索

3.1 聚类分析

在对用户、作者、作品进行简单的描述性统计分析与可视化展示后,我们尝试通过一些数据挖掘方法对数据进一步探究
对于抖音平台本身而言,如何对用户进行分类,或者分级,然后差异化的提供服务,是一个非常重要的方向
对于商务合作和广告投放者而言,如何对作者进行分类,如何选择合作的作者,也是有一定价值的问题
3.1中将针对用户和作者的数据特征,使用kmeans聚类算法量化的将两个群体进行分类

import numpy as np
import pandas as pd

from pyecharts.charts import *
from pyecharts import options as opts

from sklearn.cluster import KMeans
import joblib
from sklearn import metrics
from scipy.spatial.distance import cdist

1. 数据读取与数据处理

1.1 数据读取

user_feature = pd.read_csv('用户特征.csv', index_col=0)
author_feature = pd.read_csv('作者特征.csv', index_col=0)

1.2 数据处理

用户聚类可以服务于平台对用户分级,探索性的分析用户特点,但在二、数据可视化分析中,可以看到有一部分用户使用程度平台低 ,浏览少,不点赞,对这样的用户进行聚类分析是无效多余的,增加筛选认为至少观看过一个完整短视频且有一定浏览量的用户才具有分析意义

user_data = user_feature[(user_feature['完整观看数']>=1)&(user_feature['浏览量']>=5)]
print(len(user_data)/len(user_feature))
0.7097514856834144

而在对作者的考量上,聚类的结果是服务于商务合作和广告投放,此时核心是浏览量
而大部分的作者总浏览量非常小,这些作者是无需考虑的,故进行筛选

author_data = author_feature[(author_feature['总观完量']>=1)&(author_feature['总浏览量']>=3)]
print(len(author_data)/len(author_feature))
0.2990244347629775

2. 聚类方法与定义

2.1 聚类方法

关键参数:

  • init=‘k-means++’ (其实默认就是这个,可以不用写)
    对于kmeans算法,初始中心的选取是至关重要的。
    kmeans的随机选取方法可能会出现初始中心过于接近,导致迭代结果收敛慢,效果差
    kmeans++通过逐个选取中心,并优先选取距离较远的中心来优化初始中心的选择
  • n_clusters: 聚类数
    聚类数的确定通过综合不同指标,应用肘部法则进行判断

评价指标

  • SSE: 误差平方和
    当前迭代得到的中心位置到各自中心点簇的欧式距离总和
  • 轮廓系数:sc轮廓系数
    都是结合了聚类的类内凝聚度和类间分离度
    sc轮廓系数∈[-1, 1],越接近1越好

2.2 相关函数定义

Kmeans

def km(data, name):
    K = range(2, 10) # K值选取范围
    X = data # 数据
    # scores = { 'SSE': [], 'sc': [], 'sse': []}
    scores = {'sc': [], 'sse': []}
    for _k in K:
        # 初始化模型并进行聚类 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        kmeans = KMeans(n_clusters=_k, init='k-means++', random_state=0)
        kmeans.fit(X)
        _y = kmeans.predict(X) # 预测结果
        # 计算模型评估指标 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        sse = sum(np.min(cdist(X,kmeans.cluster_centers_,'euclidean'),axis=1))/X.shape[0]
        sc = metrics.silhouette_score(X, _y) # 计算轮廓系数
        joblib.dump(kmeans, f'{name}{_k}聚类.model')
        # 储存评估值 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        # scores['SSE'].append(SSE)
        scores['sse'].append(sse)
        scores['sc'].append(sc)
        print(f'聚{_k}类计算完成', end='\t')
    joblib.dump(scores, f'{name}聚类指标.score')
    print('指标储存完毕')
    return scores

绘制sse和sc曲线

def draw(k, sse, sc):
    chart = (
        Line(init_opts=opts.InitOpts(
            theme='light',
            width='350px',
            height='350px'
        ))
        .add_xaxis(k)
        .add_yaxis('sse', sse, yaxis_index=0, label_opts=opts.LabelOpts(is_show=False))
        .add_yaxis('sc', sc, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False))
        .extend_axis(yaxis=opts.AxisOpts())
        .set_global_opts(
            title_opts=opts.TitleOpts(title='聚类效果'),
            xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=True),
            yaxis_opts=opts.AxisOpts(
                type_="value",
                axistick_opts=opts.AxisTickOpts(is_show=True),
                splitline_opts=opts.SplitLineOpts(is_show=True),
            ),
        )
    )
    return chart

3. 用户特征聚类

3.1 模型训练与保存

user_score = km(user_data, '用户')
聚2类计算完成	聚3类计算完成	聚4类计算完成	聚5类计算完成	聚6类计算完成	聚7类计算完成	聚8类计算完成	聚9类计算完成	指标储存完毕

3.2 聚类k值选择

user_score =  joblib.load(f'用户聚类指标.score')
draw([str(x) for x in range(2,10)], user_score['sse'], user_score['sc']).render_notebook()
<div id="27634cadac5946d99e47111d0e2304ec" style="width:350px; height:350px;"></div>

通过综合肘部法则和sc值,选择 k = 4 k=4 k=4作为用户聚类模型

3.3 聚类结果

user_km = joblib.load(f'用户4聚类.model')
user_centers = pd.DataFrame(user_km.cluster_centers_, columns=user_feature.columns)
user_centers['人数']=pd.Series(user_km.predict(user_data)).value_counts()
user_centers
浏览量点赞量观看作者数观看作品数观看作品平均时长观看配乐数完整观看数去过的城市数观看作品城市数人数
065.5598930.65194763.61685365.55904011.17516758.03541327.4407471.27413347.0948279366
1381.6033653.012019353.144231381.59855810.969891276.40865492.3461541.324519140.896635416
2162.6124091.259288154.847185162.61049411.078860131.90118754.0754501.29375788.6667942610
316.7916530.19063416.51258516.79151811.31500015.9343078.1248061.17028814.57207029648

4. 作者特征聚类

4.1 模型训练与保存

author_score = km(author_data, '作者')
聚2类计算完成	聚3类计算完成	聚4类计算完成	聚5类计算完成	聚6类计算完成	聚7类计算完成	聚8类计算完成	聚9类计算完成	指标储存完毕

4.2 聚类k值选择

author_score =  joblib.load(f'作者聚类指标.score')
draw([str(x) for x in range(2,10)], author_score['sse'], author_score['sc']).render_notebook()
<div id="c4d8bf39862142f49913449f26f579e1" style="width:350px; height:350px;"></div>

通过综合肘部法则和sc值,选择 k = 4 k=4 k=4作为用作者聚类模型

4.3 聚类效果

author_km = joblib.load(f'作者4聚类.model')
author_centers = pd.DataFrame(author_km.cluster_centers_, columns=author_feature.columns)
author_centers['人数'] = pd.Series(author_km.predict(author_data)).value_counts()
author_centers
总浏览量总点赞量总观完量总作品数作品平均时长使用配乐数量发布作品日数创作活跃度(日)去过的城市数人数
011.9731670.1159815.0195983.63674710.7831113.1981383.63662511.3010081.11404657356
1376.0608583.428769165.14661120.03596111.12659013.81189520.03457824.2240661.289073723
21092.8210538.347368461.31578931.12631611.16566219.95789531.12631627.9263161.32631695
3117.0757171.14898351.54839512.43273710.9938019.43494212.43126721.2531241.2362174079

总结

聚类的结果解释性较为明显,其核心与浏览量相关,提供了一定数据特征下的量化分类作用

3.2 二分类预测

在用户对作品的浏览过程中,是否点赞是一个非常重要的指标
通过点赞行为,我们可以判断出用户的喜好,评价作品的质量等
拟通过用户特征和作品特征,训练一个用于预测用户是否会点赞的二分类模型

import numpy as np
import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc
from sklearn import ensemble
from sklearn.model_selection import GridSearchCV

import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.size'] = 20

1. 数据读取与处理

1.1 数据读取

读取数据,并保留用户特征、作品特征和是否点赞,其余无效字段如channel(不确定),finish(没有浏览行为时不存在), H、date(real_time中包括)

df = pd.read_csv('/home/mw/input/somnus8660/douyin_dataset.csv')
del df['Unnamed: 0'], df['H'], df['date'], df['finish'], df['channel']
df.head()
uiduser_cityitem_idauthor_iditem_citylikemusic_idduration_timereal_time
015692109.069166118212213.0011513.0102019-10-28 21:55:10
14407180.012432123450068.001274.092019-10-21 22:27:03
210902202.03845855634066113.00762.0102019-10-26 00:38:51
32530021.03929579214923330.002332.0152019-10-25 20:36:25
43656138.0257226918268080.00238.092019-10-21 20:46:29

其中uid, user_city为用户信息
item_id, author_id, item_city, music_id, duration_time, real_time都为作品附带信息
like即预测目标是否点赞

1.2 数据抽样处理

为了减少训练成本,对数据集中的数据进行抽样训练
通过等距抽样获取部分浏览信息作为训练数据(需要同时保证点赞数据的合理比例)

df_like = df[df['like']==1]
df_dislike = df[df['like']==0]
data = pd.concat([df_like[::20], df_dislike[::40]], axis=0)
print(len(data)/len(df))
0.02524186789707318

1.3 时间数据处理

训练数据中的real_time字段包括的是字符串对象对应代表时间值,通过将其转化为与固定时间的差值(秒)来进行数值化

flag = pd.to_datetime('2019-01-01 00:00:00')
data['real_time'] = pd.to_datetime(data['real_time'])
data['real_time'] = pd.to_timedelta( data['real_time'] - flag).dt.total_seconds()
data.head()
uiduser_cityitem_idauthor_iditem_citylikemusic_idduration_timereal_time
134320392.013246654893715.01578.01024181411.0
218114571142.0248954237131229.011318.0725305835.0
395525090136.015828821638269.01680.01023180382.0
56851115373.020925028248137.014545.0924856880.0
86472159106.0101991624618.013928.0925677638.0

1.4 数据集划分

xtrain,xtest, ytrain, ytest = \
    train_test_split(
        data.drop('like', axis=1), # X
        data['like'],test_size=0.3, # Y
        random_state=0 # random_seed
    )

2. 模型预训练

2.1 模型训练函数

def train(name, model):
    model = model.fit(xtrain, ytrain)
    print(f'{name}准确率: \t{model.score(xtest, ytest)}')
    return model

2.2 模型训练

# 逻辑回归
lgs = train('lgs', LogisticRegression(solver='liblinear', C=100.0,random_state=1))
# 朴素贝叶斯
gnb = train('gnb', GaussianNB().fit(xtrain,ytrain))
# 单棵决策树
clf = train('clf', DecisionTreeClassifier(class_weight='balanced',random_state=0))
# 随机森林
rfc = train('rfc', RandomForestClassifier(n_estimators=100, class_weight='balanced',random_state=0))
lgs准确率: 	0.9805411979325023
gnb准确率: 	0.9801611432046214
clf准确率: 	0.959866220735786
rfc准确率: 	0.9805411979325023

2.3 模型AUC曲线

def my_auc(model):
    y_test_proba = model.predict_proba(xtest)
    false_positive_rate, recall, thresholds = roc_curve(ytest, y_test_proba[:, 1])
    roc_auc = auc(false_positive_rate, recall)
    return false_positive_rate, recall, roc_auc
lgs_auc = my_auc(lgs)
gnb_auc = my_auc(gnb)
clf_auc = my_auc(clf)
rfc_auc = my_auc(rfc)
# 画图 画出俩模型的ROC曲线
plt.plot(lgs_auc[0], lgs_auc[1], color='cyan', label='AUC_lgs=%0.3f' % lgs_auc[2])
plt.plot(gnb_auc[0], gnb_auc[1], color='blue', label='AUC_gnb=%0.3f' % gnb_auc[2])
plt.plot(clf_auc[0], clf_auc[1], color='green', label='AUC_clf=%0.3f' % clf_auc[2])
plt.plot(rfc_auc[0], rfc_auc[1], color='yellow', label='AUC_rfc=%0.3f' % rfc_auc[2])
plt.legend(loc='best', fontsize=12, frameon=False)
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.ylabel('Recall')
plt.xlabel('Fall-out')
plt.show()

综合准确率和AUC值表现,模型的效果不是很好,在数据抽样时扩大抽样规模会有效的提高auc值,同时点赞和不点赞的数据分布较为不均衡也是重要原因
这里只做继续方法的演示,相对来说随机森林的效果比较好,所以选择随机森林作为二分类模型

3. 模型优化

使用GridSearchCV模块进行格栅优化,可以理解为每一个训练参数都是表格的一个维度,根据传入值,遍历格栅中每一种参数组合,最后告诉你最优组合
一般来说直接把多个模型参数输入即可,但是多个维度参数的组合会导致训练模型量剧增
这里遍历了9个n_e值和10个max_f值,加上cv=3需要三折交叉,就产生了9x10x3=270次训练,非常抽象
一个合理的解决方法是解耦,通过把两个参数分离优化来减少训练量,达到相对较好但不是最优的效果

## 需要270次的最优方法
# params = {
#     'n_estimators': [x for x in range(100,1000,100)], 
#     'max_features': range(1,20,2)
# }
# grid = GridSearchCV(
#     RandomForestClassifier(class_weight='balanced', random_state=0),
#     params, scoring="roc_auc",
#     cv=3, verbose=1, n_jobs=-1
# ).fit(xtrain, ytrain)

3.1 n_e优化

params = {
    'n_estimators': [x for x in range(100,1500,100)]
}
grid = GridSearchCV(
    RandomForestClassifier(class_weight='balanced', random_state=0),
    params, scoring="roc_auc",
    cv=3, verbose=1, n_jobs=-1
).fit(xtrain, ytrain)
Fitting 3 folds for each of 14 candidates, totalling 42 fits


[Parallel(n_jobs=-1)]: Using backend LokyBackend with 2 concurrent workers.
/opt/conda/lib/python3.6/site-packages/joblib/externals/loky/process_executor.py:706: UserWarning: A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.
  "timeout or by a memory leak.", UserWarning
[Parallel(n_jobs=-1)]: Done  42 out of  42 | elapsed: 10.1min finished
a = grid.cv_results_['mean_test_score']

plt.plot(params['n_estimators'], a, color='blue')
plt.show()
grid.best_params_
{'n_estimators': 1000}

选择参数为1000

3.2 max_f优化

params = {
    'max_features': range(2,10,2)
}
grid = GridSearchCV(
    RandomForestClassifier(n_estimators=1000, class_weight='balanced', random_state=0),
    params, scoring="roc_auc",
    cv=3, verbose=1, n_jobs=-1
).fit(xtrain, ytrain)
Fitting 3 folds for each of 4 candidates, totalling 12 fits


[Parallel(n_jobs=-1)]: Using backend LokyBackend with 2 concurrent workers.
[Parallel(n_jobs=-1)]: Done  12 out of  12 | elapsed:  8.2min finished
a = grid.cv_results_['mean_test_score']
plt.plot(params['max_features'], a, color='blue')
plt.show()
grid.best_params_
{'max_features': 6}

3.3 模型训练

rfc0 = RandomForestClassifier(n_estimators=1000,
                             max_features=6,
                             class_weight='balanced',
                             random_state=0)
rfc0 = train('rfc++', rfc0)
rfc++准确率: 	0.9805411979325023

对比优化前后

auc_rfc0 = my_auc(rfc0)
# 画图 画出俩模型的ROC曲线
plt.plot(auc_rfc0[0], auc_rfc0[1], color='cyan', label='rfc++=%0.3f' % auc_rfc0[2])
plt.plot(rfc_auc[0], rfc_auc[1], color='yellow', label='rfc=%0.3f' % rfc_auc[2])
plt.legend(loc='best', fontsize=12, frameon=False)
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.ylabel('Recall')
plt.xlabel('Fall-out')
plt.show()

虽然整体的效果不行,auc值比较低,但是可以看到有优化提升

4. 模型预测

4.1 模型准确率

df.head()
uiduser_cityitem_idauthor_iditem_citylikemusic_idduration_timereal_time
015692109.069166118212213.0011513.0102019-10-28 21:55:10
14407180.012432123450068.001274.092019-10-21 22:27:03
210902202.03845855634066113.00762.0102019-10-26 00:38:51
32530021.03929579214923330.002332.0152019-10-25 20:36:25
43656138.0257226918268080.00238.092019-10-21 20:46:29

转换一下df中的时间,看看使用2.5%左右的数据训练出来的模型准确率能有多少

flag = pd.to_datetime('2019-01-01 00:00:00')
df['real_time'] = pd.to_datetime(df['real_time'])
df['real_time'] = pd.to_timedelta( df['real_time'] - flag).dt.total_seconds()
rfc0.score(df.drop('like', axis=1), df['like'])
0.9906533771711702

4.2 一些说明

表面上来看准确率是比较高的,但是我们来看一下不点赞的数据占比

lk = df['like'].value_counts()
lk
0    1720539
1      16773
Name: like, dtype: int64
lk[0]/lk.sum()
0.9903454301817981

也就是只要全都预测不点赞,也能有99.03的准确率,模型稍微准一点,还行,但是auc值低是硬伤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5分钟快速上手Nmap指令(基于Kali系统)

前言正文1、修改Kali系统中网络配置2、Nmap简介2.1 用途2.2优势2.3 相关知识3、Nmap中最常用的命令3.1 单主机扫描3.2 多目标扫描3.3 检测目标主机漏洞3.3 时序选择3.4 保存4、kali系统中常见报错参考文献前言 本篇为理论篇&#xff0c;主要为CTF攻防做铺垫&#xff0c;围绕 基…

[附源码]SSM计算机毕业设计影院售票系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

mac m1 mysqlworkbench8 Unknown table ‘COLUMN_STATISTICS‘

原因&#xff1a;本地mysql版本是8&#xff0c;远程是mariaDb-10&#xff0c;版本不匹配导致报错。 仔细看mysqlworkbench8.0导出时的错误信息&#xff0c;有mysqldump的具体路径。 mac os (m1, ventura系统)&#xff0c;具体位置是这里&#xff1a; /Applications/MySQLWor…

【树莓派开发日记1】1.3k预算的树莓派+显示屏+键鼠的选型与拆箱物理安装

树莓派开发日记1 经过了漫长的上课与考试周期&#xff0c;终于有时间闲下来进行技术栈的开发与学习 作为立志成为优秀机器人开发者的青年工程师&#xff08;青春版&#xff09;&#xff0c;不可能不去了解微机处理系统和Ubuntu系统&#xff0c;所以在此又给自己开了一个大坑 …

OpManager 帮助排查网络延迟问题

什么是网络延迟 网络中的延迟是指数据通过网络传输到其预期目的地所需的时间。它通常表示为往返延迟&#xff0c;即数据从一个位置传输到另一个位置所需的时间。 什么原因导致网络延迟 有四个主要原因会影响网络延迟。其中包括&#xff1a; 传输介质&#xff0c;例如 WAN 或…

JUC并发编程第六篇,带你了解Java内存模型JMM

JUC并发编程第六篇&#xff0c;带你了解Java内存模型JMM一、Java Memory Model&#xff08;Java内存模型&#xff09;是什么&#xff1f;二、JMM规范三大特性1. 可见性2. 原子性3. 有序性三、JMM规范下多线程对变量的读写过程四、JMM规范下多线程先行发生原则&#xff08;happe…

Oracle面试题整理

目录 Oracle面试题整理 1.MySQL和Oracle的区别&#xff1a; 2.Oracle中function和procedure的区别&#xff1f; 3. 比较truncate和delete命令 &#xff1f; 4.oralce中 rowid, rownum的定义 5. 事务的特性&#xff08;ACID&#xff09;是指什么 6. 列举几种表连接方式…

[附源码]计算机毕业设计springboot天狗电子商城系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

plink2.0和plink1.9的忧伤笔记

虽然plink2.0已经存在好久了&#xff0c;但是一直用的都是plink1.9&#xff0c;因为语法熟悉。更主要是plink2.0语法变动太大&#xff0c;害怕步子迈得太大了…… 今天看一下plink2.0的读入和输出数据常用参数&#xff0c; plink2.0用是不会用的&#xff0c;2022年都不会用&am…

计算机网络基础

前言 计算机网络学习的核心内容就是网络协议的学习。网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。因为不同用户的数据终端可能采取的字符集是不同的&#xff0c;两者需要进行通信&#xff0c;必须要在一定的标准上进行。一个很形象地比喻就是…

平时健身买什么耳机好、分享五款最好的运动耳机推荐

不少人喜欢在健身房或者户外运动中使用手机或者MP3来听音乐&#xff0c;这种方式不仅可以减少运动中的枯燥感&#xff0c;而且那些节奏较强的音乐还能够进一步激发人们的运动潜能&#xff0c;达到事半功倍的效果。作为音乐传递的桥梁&#xff0c;一款佩戴舒适的运动耳机是必不可…

又撸了一个开源项目!!!

花了两周左右&#xff0c;写了一个客户关系管理系统&#xff0c;基于 Vue Go 实现&#xff0c;主要功能有仪表盘、客户管理、合同管理、产品管理&#xff0c;订阅等功能。 前几天已经在 Github 上开源了&#xff0c;今天也把项目部署到云服务器上了&#xff0c;很完美&#x…

负载均衡组件Ribbon核心-@LoadBalanced-上

引言 书接上篇 微服务负载均衡小能手-Ribbon 使用RIbion实现负载均衡远程调用 Bean LoadBalanced public RestTemplate restTemplate(){return new RestTemplate(); } 都知道没有LoadBalanced注解前&#xff0c;RestTemplate就是一个简单的http请求工具类&#xff0c;贴上该…

AI-多模态-2021:DALL-E模型【文本生成图像工具】【OpenAI】

Dall-e&#xff1a;从拟物文字到图片的创造 人类不断地从五种感官接收和整合信息&#xff0c;通过视觉、听觉、触觉、嗅觉和味觉等生物信息来理解文字和图片。然而文字和图片属于符号&#xff0c;Dall-e模型在理解符号的含义时并不能通过生物信息的传递。通过将对自然语言的理…

Ambari-yarn-timeline 内置 HBase数据表清理

HDP 集群 timeline 内置的 HBase 数据表持续增大&#xff0c;我们将默认TTL30改 为7 天。 ambari界面YARN 服务中 的 timeline v2.0 timeline 内置 HBase数据HDFS路径 &#xff1a; 表在HDFS上的大小 使用如下命令进入 Hbase shell [hdfswinner-backup-hdp root]$ hbase -…

网站变灰代码如何让网页变灰

1.网站变灰代码应用场景 一般在清明节&#xff0c;全国哀悼日&#xff0c;大地震的日子&#xff0c;以及一些影响力很大的伟人逝世或纪念日的时候&#xff0c;身为站长的我们都会让自己的网站的全部网页变成灰色&#xff08;黑白色&#xff09;&#xff0c;以表示我们对逝者的…

数据分析之人力资源管理驾驶舱

驾驶舱是数据分析报表中用于展示关键分析指标和综合展示数据情况的&#xff0c;因此需要展示的内容多&#xff0c;需要做的内容甄选也多。 一 前言 人力资源作为企业的关键生产力&#xff0c;是一个企业成长发展的根本。随着“知识经济”时代的到来、市场竞争的加剧&#xff…

Shiro-全面详解(学习总结---从入门到深化)

Shiro介绍_Shiro简介 Shiro是apache旗下的一个开源安全框架&#xff0c;它可以帮助我们完成身 份认证&#xff0c;授权、加密、会话管理等功能。它有如下特点&#xff1a; 1、易于理解的API 简单的身份认证&#xff0c;支持多种数据源 2、简单的授权和鉴权 3、简单的加密API 4、…

《机器学习实战》11.Apriori算法进行关联分析

目录 使用Apriori算法进行关联分析 1 关联分析 2 Apriori原理 3 使用Apriori算法来发现频繁集 3.1 生成候选项集 3.2 组织完整的Apriori算法 4 从频繁项集中挖掘关联规则 5 示例&#xff1a;发现国会投票中的模式 6 示例&#xff1a;发现毒蘑菇的相似特征 7 本章小结…

线上服务Java进程假死快速排查、分析

线上服务Java进程假死快速排查、分析 最近我们有一台服务器上的Java进程总是在运行个两三天后就无法响应请求了&#xff0c;具体现象如下&#xff1a; 请求业务返回状态码502&#xff0c;查看进程还在&#xff0c;意味着Java进程假死&#xff0c;无法响应请求了&#xff1b;该…