You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为sklearn DecisionTreeRegressor获取TikTok时长的预测区间?

获取TikTok使用时长预测区间的可行方案

针对你的分类输入(App类型)+数值目标(使用时长)场景,结合你提供的小样本数据集,以下是几种可靠的预测区间获取方法,同时解答你关于分位数随机森林的疑问:

1. 利用单决策树的叶节点分布

决策树回归的核心逻辑是将样本划分到叶节点,每个叶节点内的目标值分布就是该节点的预测分布。对于你的分类特征,同一App的样本会被分到同一个叶节点,因此可以直接提取该叶节点的目标值分位数构建区间:

from sklearn.tree import DecisionTreeRegressor
import pandas as pd

data = {'App':  ['Tiktok', 'Instagram', 'Twitter', 'Tiktok', 'Instagram', 'Twitter', 'Tiktok'],
    'TimeSpent': ['50', '40', '20', '50', '45', '30', '40']}
df = pd.DataFrame(data)
X = pd.get_dummies(df['App'], columns=['App']).astype('category')
y = df['TimeSpent'].astype(float)

# 训练决策树
model = DecisionTreeRegressor(random_state=44)
model.fit(X, y)

# 获取TikTok对应的叶节点及该节点的所有目标值
leaf_indices = model.apply(X)
tiktok_leaf = leaf_indices[X['Tiktok'] == 1].iloc[0]
leaf_y_values = y[leaf_indices == tiktok_leaf]

# 计算50%预测区间(25/75分位数)
lower_q25 = leaf_y_values.quantile(0.25)
upper_q75 = leaf_y_values.quantile(0.75)
print(f"TikTok使用时长50%预测区间: [{lower_q25:.1f}, {upper_q75:.1f}]")

# 可选:计算90%预测区间(5/95分位数)
lower_q5 = leaf_y_values.quantile(0.05)
upper_q95 = leaf_y_values.quantile(0.95)
print(f"TikTok使用时长90%预测区间: [{lower_q5:.1f}, {upper_q95:.1f}]")

2. 分位数随机森林(RandomForestQuantileRegressor)

合理性与效率分析

  • 合理性:分位数随机森林专门用于估计预测分位数,能给出稳健的区间估计,对分类特征(已做独热编码)完全适配。但你的数据集极小(仅7条样本),随机森林“降低方差”的优势无法体现,区间结果和单决策树差异不大。
  • 效率:小数据集下计算成本可以忽略,完全高效。

分位数选择说明

25/75分位数构成的四分位距,代表中间50%的观测值,适合描述数据的集中趋势区间;如果需要覆盖更多极端情况,可以选择5/95分位数(90%覆盖概率)或2.5/97.5分位数(95%覆盖概率),具体取决于业务需求。

代码示例:

from quantile_forest import RandomForestQuantileRegressor
import pandas as pd

data = {'App':  ['Tiktok', 'Instagram', 'Twitter', 'Tiktok', 'Instagram', 'Twitter', 'Tiktok'],
    'TimeSpent': ['50', '40', '20', '50', '45', '30', '40']}
df = pd.DataFrame(data)
X = pd.get_dummies(df['App'], columns=['App']).astype('category')
y = df['TimeSpent'].astype(float)

# 训练分位数随机森林
qrf = RandomForestQuantileRegressor(random_state=44)
qrf.fit(X, y)

# 构造TikTok预测输入
y_pred = pd.DataFrame(0, index=range(1), columns=X.columns)
y_pred.at[0, 'Tiktok'] = 1

# 预测25%和75%分位数
lower_q25 = qrf.predict(y_pred, quantiles=0.25)[0]
upper_q75 = qrf.predict(y_pred, quantiles=0.75)[0]
print(f"TikTok使用时长50%预测区间: [{lower_q25:.1f}, {upper_q75:.1f}]")

3. 直接基于类别统计分布(小样本最优方案)

由于你的输入是纯分类特征,每个App的使用时长本身就是一组独立样本,无需机器学习模型,直接统计该类别的分位数即可得到最直观的区间:

import pandas as pd

data = {'App':  ['Tiktok', 'Instagram', 'Twitter', 'Tiktok', 'Instagram', 'Twitter', 'Tiktok'],
    'TimeSpent': ['50', '40', '20', '50', '45', '30', '40']}
df = pd.DataFrame(data)

# 提取TikTok的所有使用时长数据
tiktok_times = df[df['App'] == 'Tiktok']['TimeSpent'].astype(float)

# 计算分位数区间
q25 = tiktok_times.quantile(0.25)
q75 = tiktok_times.quantile(0.75)
print(f"TikTok使用时长50%统计区间: [{q25:.1f}, {q75:.1f}]")

关键注意事项

  • 样本量限制:你的数据集仅7条,TikTok仅3个样本,任何方法的区间估计都会非常不稳定。若可能,优先增加样本量以提升结果可靠性。
  • 区间选择:如果需要展示典型使用时长范围,25/75分位数是合理选择;若需覆盖绝大多数可能值,选择更宽的分位数区间。
  • 模型优先级:小样本下,直接统计类别分布 > 单决策树 > 分位数随机森林;大样本下,分位数随机森林能提供更稳健的区间。

内容的提问来源于stack exchange,提问作者o.d.rinani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:55:16