数据挖掘期末答题模板:数据仓库视图、决策树、聚类与车险费率

发布时间:2026/11/3 11:16:03
数据挖掘期末答题模板:数据仓库视图、决策树、聚类与车险费率

简介:这是一份面向高校数据仓库与数据挖掘课程复习备考的期末考试试卷,适合本科生、研究生在期末冲刺或自测时使用。试卷以简答题和综合分析题为主,覆盖数据仓库设计四视图、数据预处理技术、星型/雪花型/实时星座模式、决策树分类算法框架,以及文本TF向量距离计算与KMeans聚类中心求解等核心考点。综合分析部分还给出汽车保险费率评估方案设计,要求分析事故概率与赔付金额的决策特征并选择预测模型,便于读者检验知识迁移与方案设计能力。资源包共1个doc文件,约64KB,内容紧凑,可直接打开查阅或打印练习。目前已有735人学习,适合需要梳理重点、查漏补缺并熟悉综合题答题思路的学习者参考。

1. 数据挖掘期末考试里,最不该丢的是简答第一题

数据挖掘期末考试的卷面结构通常很固定:简答 40 分、综合分析 50 分,剩下 10 分留给概念辨析。很多人把复习时间全压在 30 分的车险方案题上,结果简答第一题「数据仓库设计中需要考虑的四种视图」只写出两个,10 分直接掉一半。这张试卷的评分逻辑很清楚——简答考记忆的准确度和分类的清晰度,综合考流程的完整度和参数的合理性,两套标准完全不能混用。这份卷子适合已经过了一遍教材、但答题总卡在「知道却写不全」的人:它不教新知识,只教怎么把会的东西落到得分点上。

2. 数据仓库设计:四种视图与三种模式的答题模板

2.1 四种视图:按「谁在看、看什么、粒度多细」拆开

操作视图面向源业务系统,按业务流程组织数据,反映的是日常交易产生的原始记录,粒度最细,典型用途是给 ETL 抽取做输入。分析视图面向分析人员,按主题域组织,已经做过汇总和轻度聚合,典型形态是多维模型,供 OLAP、报表和指标看板使用。历史视图解决的是「随时间变化」这件事,靠拉链表、快照表或时间戳版本记录数据在每个时点的状态,支撑同比、环比和趋势分析。细节视图强调的是保留原子粒度,不聚合、不丢字段,用于追溯单据、审计核对和下钻查询。

这四种视图不是四个系统,而是同一套数据在不同使用场景下的四种切面。答题时最容易犯的错是只给定义不给用途,阅卷时看不到「面向谁」和「粒度」这两个关键词,分数就打不满。稳妥的写法是每个视图写三句:一句定义、一句面向对象、一句典型用途或存储形态。

视图面向对象粒度典型用途
操作视图源业务系统最细,单笔交易ETL 抽取、数据核对
分析视图分析人员、管理层汇总后的主题粒度OLAP、报表、指标体系
历史视图需要看变化的人按时间版本保留趋势、同比环比、审计
细节视图追溯与核查场景原子级,不聚合单据追溯、下钻、对账

表格不是必须画,但如果在答题纸上能顺手画成三列,阅卷人扫一眼就能确认你分得清,这是很划算的操作。

2.2 星型、雪花型、星座模式:三句话讲清差别与代价

星型模式是最常见的一种,一个事实表放在中心,周围挂一组维度表,维度表不做规范化,允许冗余。好处是连接次数少、查询路径短、SQL 好写,代价是维度数据重复存储,修改维度属性时要同步多行。雪花型模式是星型的规范化版本,把维度表继续拆成主从结构,比如车辆维度里的品牌单独抽一张表,冗余小了,但查询要多一层 JOIN,性能和维护复杂度都上去了。

星座模式(也叫事实星座)是多个事实表共享一组一致性维度,适合企业级数据仓库或多主题集市并存的情况。原料里提到的「实时星座」,答题时把它落到事实表的写入方式上就行:事实表支持增量加载甚至准实时写入,维度表保持一致性,查询时能同时拿到交易事实和行为事实。这样答既不跑题,又能体现你理解了这个模式的真实用途。

-- 星型模式:事实表直接连维度表,两次 JOIN 就能出结果 SELECT d.brand, SUM(f.premium) AS premium_sum, SUM(f.claim_amount) AS claim_sum FROM fact_policy f JOIN dim_vehicle d ON f.vehicle_id = d.vehicle_id JOIN dim_region r ON f.region_id = r.region_id WHERE f.stat_date BETWEEN '2024-01-01' AND '2024-12-31' GROUP BY d.brand; -- 雪花模式:品牌被规范化到单独一张表,需要多一层 JOIN SELECT b.brand_name, SUM(f.premium) AS premium_sum FROM fact_policy f JOIN dim_vehicle d ON f.vehicle_id = d.vehicle_id JOIN dim_brand b ON d.brand_id = b.brand_id -- 多出来的这一层就是代价 GROUP BY b.brand_name;

两段 SQL 的差别就在那一次额外的 JOIN 上,而这正是雪花模式「省空间、费性能」的具体体现。答题时把这句话写出来,比单纯背「雪花模式减少了冗余」要有说服力得多。参数上注意stat_date这类分区字段一定要出现在 WHERE 里,否则大事实表会全表扫描,这一点在方案设计题里提到会加分。

2.3 简答题 1 和 4 的完整答法

第 1 题 10 分,四种视图每种 2 分,开头一句总述占 2 分。总述可以写「数据仓库设计需要同时满足操作、分析、历史追溯和明细核查四类需求,对应四种视图」。然后每种视图按「定义 + 面向对象 + 用途」三句话展开,不要写成一大段散文。判卷时老师找的是关键词:操作视图对应源系统、分析视图对应主题与汇总、历史视图对应时间维度、细节视图对应原子粒度。四个词对上,这题基本满分。

第 4 题 10 分,三个模式各 3 分,收尾对比 1 分。每个模式同样三句话:结构长什么样、优缺点是什么、什么场景用。星型写「事实表居中、维度表不规范化、查询快但冗余高」,雪花写「维度表规范化、冗余低但多表连接、查询变慢」,星座写「多事实表共享一致性维度、适合企业级和实时写入场景」。最后补一句选型建议:分析型查询为主、维度变更不频繁的选星型,维度层级复杂且存储敏感的选雪花,多主题并存的选星座。

这类题通常这么答最稳:先给一句总起定调,再分点展开,最后给一句选型结论。面试官或者阅卷人最想听的不是你背了多少定义,而是你能不能在三句话内说清「它是什么、它贵在哪、什么时候用它」。

2.4 分位数-分位数图:四步读出两组价格数据的差异

Q-Q 图的做法是把两组数据各自排序,取相同分位数的值组成点对,横轴放一家的分位数,纵轴放另一家的分位数。解读按四步走,一步一句话,正好凑成一段完整答案。

第一步看形状:如果散点大致落在一条直线上,说明两组数据的分布类型相同;如果明显弯曲成弧线,说明分布形状不同,比如一边是正态、一边是长尾。第二步看斜率:斜率大于 1,说明纵轴那组数据的离散程度更大,价格分布更分散;斜率小于 1 则相反。第三步看位置:如果整条线在 45 度参考线上方平移,说明在相同分位点上纵轴那家的价格系统性更高,也就是整体更贵。第四步看尾部:如果中间段贴合直线、两端明显翘起或下垂,说明差异集中在极端值区间,中位数附近其实差不多。

答题时把这四步串成一段:「两公司的价格分布在主体区间基本一致,但高分段偏离参考线,说明高价车型的定价策略差异明显」。这样写既点了分布形状,又点了业务含义,比只写「两家价格差不多」多拿一半分。常见的失分写法是只描述「点很集中」,却不说明集中在哪里、意味着什么。

3. 数据预处理与决策树:从清洗顺序到建树框架

3.1 四种预处理技术的作用与先后顺序

数据清洗解决的是「脏」的问题:缺失值可以删除、可以用均值中位数众数填充、也可以用回归或插补模型预测;噪声可以用分箱平滑、回归拟合或聚类剔除;此外还要处理重复记录和不一致编码,比如同一车型出现「轿车」「小轿车」两种写法。数据集成解决的是「散」的问题:多个源系统的数据要统一实体、消除同名异义和异名同义,处理冗余属性,消解不同源之间的取值冲突。

数据变换解决的是「不可用」的问题:规范化(最小最大规范化、零均值规范化、小数定标)把量纲拉齐,离散化把连续值切成区间,属性构造则生成比率类新特征,比如把「赔付总额」和「保单数」组合成「件均赔付」。数据规约解决的是「太大」的问题:维归约用主成分分析或属性子集选择砍掉冗余维度,数值归约用直方图、聚类、抽样或小波变换压缩数据量。

顺序上不必死记「清洗→集成→变换→规约」,更好的答法是按问题来源排:单表内的缺失噪声先清洗,跨源冲突在集成阶段处理,量纲和分布问题在变换阶段解决,规模和维度问题最后规约。这样答能体现你理解每一步在解决什么,而不是背了个流程。

3.2 决策树算法框架:一段能背下来的伪代码

决策树的核心就三件事:在当前节点上选一个最能区分样本的属性,按这个属性的取值把数据切开,对每个子集递归重复,直到满足停止条件。属性选择的准则有三种:信息增益偏向取值多的属性、增益率做了惩罚、基尼指数计算更省。下面这段框架把选属性、切分、兜底和剪枝位置都留出来了。

def build_tree(data, attrs, depth=0, max_depth=8, min_samples=5): # 停止条件:样本够纯、没有可用属性、或到达深度/样本量下限 if is_pure(data) or not attrs or depth >= max_depth or len(data) < min_samples: return Leaf(label=多数类(data)) # 分类取众数,回归取均值 best = choose_best_attr(data, attrs, criterion="info_gain") # 也可用增益率/基尼 node = Node(attr=best) for value in values_of(best): subset = split(data, best, value) if not subset: # 子集为空时用父节点众数兜底 node.branches[value] = Leaf(label=多数类(data)) else: node.branches[value] = build_tree( subset, attrs - {best}, depth + 1, max_depth, min_samples ) return node

max_depth控制树高,防止把训练集的噪声也学进去;min_samples控制叶节点最小样本量,太小会过拟合,太大则欠拟合;criterion决定分裂质量,ID3 用信息增益、C4.5 用增益率、CART 用基尼指数。递归返回后通常还要做一遍剪枝,预剪枝靠上面的停止条件,后剪枝则是先长满再自底向上回退,用验证集判断剪掉某个子树后准确率是否上升。

答题时把这四步写全——选属性、划分数据、递归建树、停止与剪枝——再补一句「属性选择准则决定树的形状,剪枝策略决定树的泛化能力」,框架题就能拿满。只写「用信息增益建树」是拿不到结构分的。

3.3 简答题 3 和 5 的得分点拆解

第 3 题问三种预处理技术及作用,10 分的话每种 3 分,收尾一句 1 分。每种技术写「名称 + 解决什么问题 + 一两个具体手段」,比如清洗写缺失值填充与噪声平滑、集成写实体识别与冲突消解、变换写规范化与离散化。如果只写名称不写手段,容易被判成「知道有这么个词但不会用」。

第 5 题给决策树分类算法框架,分值通常按步骤切:属性选择准则 2 分、递归划分 2 分、停止条件 2 分、叶节点判定 2 分、剪枝 2 分。写的时候用编号分步,每步一句话,别写成连续段落。可以补一句复杂度说明:建树时间主要花在每个节点上计算分裂指标,属性多、样本大时通常先做属性离散化或抽样。

4. 文本向量与聚类:四文档距离手算与 KMeans 中心点

4.1 距离度量怎么选:欧氏、曼哈顿、余弦各管一段

欧氏距离衡量的是绝对差异,适合各维量纲一致、需要体现「数值差多少」的场景,缺点是维度一高,大部分点之间的距离趋于相近,区分度下降。曼哈顿距离是各维绝对差之和,对离群值没那么敏感,在高维稀疏向量上有时比欧氏更稳。余弦相似度只看方向不看长度,特别适合词频向量这种「长度受文档篇幅影响、方向才代表主题」的数据。Jaccard 系数则用于集合型数据,比如用户购买过的商品集合。

试卷里给了词频向量却没指定度量时,正确做法是先声明「本文采用欧氏距离,理由是各维均为词频、量纲一致」,然后再算。不声明直接算,即使结果对,过程分也可能被扣;如果题目暗示文本主题相似性,用余弦更贴题,但要在答案里说明为什么换。

4.2 四个文档两两距离的手算过程

四个文档的 8 维词频向量为:文档 1 是 [2,3,4,2,0,0,0,1],文档 2 是 [2,2,3,2,0,0,0,1],文档 3 是 [0,0,0,0,2,3,3,4],文档 4 是 [0,0,0,0,3,4,3,4]。手算时先做逐维相减,平方后求和再开方,草稿上把差的平方写成一列最不容易错。

import math docs = { "d1": [2, 3, 4, 2, 0, 0, 0, 1], "d2": [2, 2, 3, 2, 0, 0, 0, 1], "d3": [0, 0, 0, 0, 2, 3, 3, 4], "d4": [0, 0, 0, 0, 3, 4, 3, 4], } def euclidean(a, b): # 逐维求差的平方和,再开方;两向量维度必须对齐 return math.sqrt(sum((x - y) ** 2 for x, y in zip(a, b))) def manhattan(a, b): # 各维绝对差之和,对离群维度的惩罚比欧氏轻 return sum(abs(x - y) for x, y in zip(a, b)) def cosine_dist(a, b): # 余弦距离 = 1 - 余弦相似度;任一向量为零向量时按最大距离处理 dot = sum(x * y for x, y in zip(a, b)) na, nb = math.sqrt(sum(x * x for x in a)), math.sqrt(sum(y * y for y in b)) if na == 0 or nb == 0: return 1.0 return 1 - dot / (na * nb) for i in docs: for j in docs: if i < j: print(i, j, round(euclidean(docs[i], docs[j]), 3), manhattan(docs[i], docs[j]), round(cosine_dist(docs[i], docs[j]), 3))

跑出来的结果整理成表,就是标准答案的形态:文档 1 与 2 的欧氏距离约 1.414、曼哈顿距离 2、余弦距离约 0.013;文档 3 与 4 的欧氏距离约 1.732、曼哈顿 3、余弦距离约 0.013;跨组四对(1-3、1-4、2-3、2-4)的欧氏距离分别是 8、8.718、7.211、8,曼哈顿距离分别是 22、24、20、22,余弦距离全部为 1。

欧氏 曼哈顿 余弦距离 d1-d2 1.414 2 0.013 d1-d3 8.000 22 1.000 d1-d4 8.718 24 1.000 d2-d3 7.211 20 1.000 d2-d4 8.000 22 1.000 d3-d4 1.732 3 0.013

这张表本身就是答案的一半。写卷面时把公式、代入过程、结果三行分开写,公式行写d(x,y)=sqrt(Σ(xi-yi)²),代入行写出差的平方和,结果行给数值并保留三位小数。15 分的计算题里,公式 3 分、过程 6 分、结果 6 分是常见切法,只给结果不写过程,分数会掉得很干脆。

4.3 KMeans 两个簇中心点的推导与写法

从距离表能直接看出分簇结构:文档 1 和 2 在前四维有值、后四维接近 0,文档 3 和 4 正好相反,两组之间余弦距离为 1,组内余弦距离接近 0,聚成两类是必然结果。KMeans 的簇中心就是簇内所有向量按维度取算术平均。

def centroid(vectors): n = len(vectors) # 逐列求均值:每个维度独立求和后除以样本数 return [round(sum(v[k] for v in vectors) / n, 2) for k in range(len(vectors[0]))] c1 = centroid([docs["d1"], docs["d2"]]) c2 = centroid([docs["d3"], docs["d4"]]) print(c1) # [2.0, 2.5, 3.5, 2.0, 0.0, 0.0, 0.0, 1.0] print(c2) # [0.0, 0.0, 0.0, 0.0, 2.5, 3.5, 3.0, 4.0]

聚类 1 的中心是 [2, 2.5, 3.5, 2, 0, 0, 0, 1],聚类 2 的中心是 [0, 0, 0, 0, 2.5, 3.5, 3, 4]。答题时除了给这两个向量,还要补三句话:目标函数是最小化簇内样本到中心的距离平方和;迭代过程是「分配样本→更新中心→判断中心是否变化或达到最大迭代次数」;停止条件是中心不再移动或目标函数下降幅度小于阈值。

如果题目指定用余弦相似度,中心点仍按算术平均给出,但要加一句说明:余弦度量下的均值中心需要重新归一化才能保持方向语义,考试中通常按均值近似处理。这句话能体现你知道两种度量下中心的差异,是拉开分的地方。

5. 车险费率方案与常见错误:30 分综合题的正面答法与五处失分点

5.1 决策特征:RFID 轨迹能变成哪些可用变量

这题的关键不是列一堆车辆属性,而是证明你能把「过卡记录」翻译成风险变量。RFID 读卡器只能感知某辆车在某个时刻经过了某个路口,所以能导出的是频次、路径、时段和空间范围,不能凭空写出急刹、超速这类没有传感器支撑的变量。

车辆静态特征放车型、品牌、车龄、购置价、排量、安全配置,这些直接关联维修成本和驾驶风格。行为特征从轨迹里来:统计周期内的日均过卡次数可近似代替行驶里程;夜间时段(比如 22 点到次日 6 点)的通行占比反映高风险时段暴露;常经路段的等级和该路段历史事故率可以合成一个「路段风险分」;活动半径和跨区域行驶比例反映使用强度;工作日与周末的出行规律差异能区分通勤车和营运嫌疑车。驾驶员特征放年龄、驾龄、历史出险次数、违章次数,环境特征放常行驶区域的路网密度和人口密度。

答题时把特征分三组写——车、人、路——每组三到四个,并说明每个特征和风险的因果方向,比如「夜间通行占比越高,视野条件越差,事故概率预期上升」。只写「车型、品牌、年限」三项,是把 30 分的题答成了 5 分。

5.2 预测模型:事故概率用分类,赔付金额用回归

事故概率是一个二分类问题:标签是保单年度内是否出险,特征就是上一节那批变量。逻辑回归是首选,因为系数可解释、能直接转成费率因子,符合费率监管对可解释性的要求;梯度提升树可以作为效果对照,但要做特征重要性和部分依赖分析来解释。评估看 AUC 和 KS,还要看校准曲线,因为费率定价依赖的是概率的绝对值,不只是排序。

赔付金额是回归问题,而且分布严重右偏、大量零值,直接用线性回归会翻车。行业里常用 Tweedie 分布的广义线性模型,或者拆成两段:先算是否出险,再算出险条件下的赔付金额,两者相乘得到期望赔付。下面这段把两段式的计算链路写清楚。

# 两段式期望赔付:分类管「是否出险」,回归管「出险后赔多少」 p_claim = clf.predict_proba(X)[:, 1] # 出险概率,取值 0~1 sev_hat = reg.predict(X) # 出险条件下的赔付金额预测 expected_loss = p_claim * sev_hat # 每辆车的期望赔付 pure_rate = expected_loss / insured_value # 纯风险损失率,按保额摊薄 gross_rate = pure_rate / (1 - expense_ratio - profit_margin) # 加成后费率

p_claim来自分类模型,sev_hat来自回归模型,两者相乘才是一年的期望赔付;insured_value是保额,除完之后得到纯风险损失率;expense_ratio是费用率、profit_margin是利润率,分母体现「保费要覆盖赔付、费用和合理利润」。最后再乘上从车型、区域等维度来的调整系数,就形成了「限高不限低」框架下的自主定价。

答题时补一句模型验证:用时间外样本做回溯测试,比较预测赔付与实际赔付的偏差;再做分组单调性检查,确保高风险组的费率确实更高。这句话是区分「学过模型」和「做过定价」的分水岭。

5.3 五处常见错误:错在哪、为什么错、怎么答对

错误一:把四种视图答成数据库的三级模式。错在把数据仓库设计视图和外模式、模式、内模式混为一谈。根源是两套概念都带「视图」二字,复习时没做区分。答对的写法是紧扣「操作、分析、历史、细节」四个词,每个都落到面向对象和粒度上,绝不提三级模式。

错误二:星型与雪花型只写「规范化与否」,不写代价。这样答只能拿到识记分,拿不到理解分。原因是没有把结构和性能、维护成本连起来。正确答法是每个模式配一句代价说明:星型冗余高但连接少、雪花冗余低但多表连接拖慢查询、星座适合多事实表共存但要维护一致性维度。

错误三:Q-Q 图只写「两点分布接近」。错在只看整体不看细节,漏掉了斜率和尾部两个信息源。根源是把它当成普通的散点图来描述。答对的写法是四步走:看是否成直线判断分布形状、看斜率判断离散程度、看相对参考线的位置判断整体高低、看两端偏离判断极端值差异。

错误四:距离计算不声明度量,直接套欧氏公式。题目给了词频向量,其实余弦更贴切,直接套欧氏虽然不算错,但少了选择依据这一层。正确做法是先写一句「选用欧氏距离,因为各维均为词频、量纲一致」,或者「选用余弦相似度,因为文档长度差异会影响词频绝对值」,再给公式和结果。

错误五:车险题把事故概率和赔付金额塞进一个模型。错在没意识到这是两个不同性质的预测任务,一个是二分类、一个是右偏回归。根源是审题时只看到「评估费率」四个字。答对的写法是明确拆成两段,分类模型输出出险概率,回归模型输出条件赔付额,相乘得到期望损失,再除以保额得到纯风险损失率。

6. 考场分配:90 分钟里 5 道大题的时间表与检查清单

这张卷子的题量不大,但计算和方案设计都吃时间。比较稳的分配是:简答四题共 30 分钟,每题 7 分钟左右,写完就过不回头;文档距离计算 15 分钟,公式、代入、结果三行分开写;KMeans 中心点 8 分钟,含三句说明;车险方案 30 分钟,特征、模型、验证三段各占三分之一;最后留 7 分钟检查单位和有效数字。

题型分值建议用时交卷前必查
简答 1、42015 分钟四种视图是否都写了面向对象和粒度
简答 2、3、53015 分钟Q-Q 图是否写了斜率和尾部
文档距离1015 分钟是否声明度量、是否保留三位小数
KMeans 中心108 分钟是否写了目标函数和停止条件
车险方案3030 分钟特征是否分车、人、路三组,模型是否拆成两段
复查—7 分钟纯风险损失率的分母是否写对

交卷前的检查清单只有四条:所有计算题有没有写公式;所有简答题有没有分点;所有方案题有没有写评估方法;所有涉及「选择」的地方有没有给理由。这四条对应的是过程分、结构分、严谨分和判断分,加起来往往比多做对一道小题更值钱。

说个自己的教训。早些年做这类卷子,我总在最后十分钟才发现距离表算错一个平方项,回头改已经来不及。从那以后我每次做计算题,都强制走一遍「先写公式、再列差值平方、最后开方」的三行格式,哪怕时间紧也不省这一步,因为省下来的两分钟,往往要用重做一整题来还。这份卷子里的九道题,按得分点逐条拆开整理在题库里,需要拿去对着练的可以自取。希望帮到你。

本文还有配套的精品资源,点击获取