面试题答案
一键面试1. 复杂聚合操作分析搜索行为模式
1.1 数据准备
假设索引结构如下:
{
"mappings": {
"properties": {
"user_id": { "type": "keyword" },
"search_keyword": { "type": "text" },
"product_id": { "type": "keyword" },
"browse_time": { "type": "date" },
"user_geo": { "type": "keyword" },
"user_age": { "type": "integer" }
}
}
}
1.2 基于地域的嵌套聚合
{
"aggs": {
"by_geo": {
"terms": {
"field": "user_geo"
},
"aggs": {
"by_search_keyword": {
"terms": {
"field": "search_keyword"
},
"aggs": {
"avg_browse_time": {
"avg": {
"field": "browse_time"
}
}
}
}
}
}
}
}
上述聚合操作先按地域分组,然后在每个地域内按搜索关键词分组,并计算每个搜索关键词下的平均浏览时间,以分析不同地域用户对不同关键词的搜索浏览行为。
1.3 基于年龄的桶聚合
{
"aggs": {
"age_ranges": {
"range": {
"field": "user_age",
"ranges": [
{ "from": 18, "to": 30 },
{ "from": 31, "to": 50 },
{ "from": 51, "to": 100 }
]
},
"aggs": {
"most_popular_product": {
"terms": {
"field": "product_id",
"size": 1
}
}
}
}
}
}
此聚合操作将用户按年龄范围分组,然后在每个年龄范围内找出最常浏览的商品ID,以分析不同年龄群体的热门浏览商品行为。
2. 选择决策树模型预测潜在购买行为
2.1 数据预处理
从ElasticSearch中导出数据,将日期格式的browse_time
转换为合适的特征(如时间戳或星期几等)。对分类特征(如user_geo
)进行编码(如独热编码),将数据划分为训练集和测试集,比如按照70%训练集,30%测试集划分。
2.2 决策树模型训练
在Python中使用scikit - learn
库:
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 假设X为特征矩阵,y为标签(是否购买)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
3. 模型调优
3.1 调优参数
- max_depth:限制树的最大深度,防止过拟合。例如,将
max_depth
从默认的None
设置为5 - 10之间的值进行试验。 - min_samples_split:指定在一个节点分裂所需的最小样本数。增加该值可以防止过拟合,如设置为5 - 10。
- min_samples_leaf:指定一个叶节点所需的最小样本数。设置为2 - 5等较小值可以防止模型过拟合。
3.2 调优方法
- 网格搜索(Grid Search):使用
GridSearchCV
在预定义的参数网格中进行穷举搜索。
from sklearn.model_selection import GridSearchCV
param_grid = {
'max_depth': [5, 8, 10],
'min_samples_split': [5, 8, 10],
'min_samples_leaf': [2, 3, 4]
}
grid_search = GridSearchCV(DecisionTreeClassifier(), param_grid, cv = 5)
grid_search.fit(X_train, y_train)
best_model = grid_search.best_estimator_
- 随机搜索(Random Search):
RandomizedSearchCV
从参数分布中随机选择参数组合进行评估,相比网格搜索计算成本更低,适合参数空间较大的情况。
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_dist = {
'max_depth': randint(3, 15),
'min_samples_split': randint(2, 10),
'min_samples_leaf': randint(1, 5)
}
random_search = RandomizedSearchCV(DecisionTreeClassifier(), param_dist, n_iter = 10, cv = 5)
random_search.fit(X_train, y_train)
best_model = random_search.best_estimator_