2019网易互娱数据挖掘实习生笔试部分记录

艾勇sjtu的blog 2019-07-01

今晚做完了网易互娱数据挖掘实习生的笔试题,虽然大部分的题目都不太记得了。但是还是有一些印象比较深的坑需要填一下。比起腾讯和字条跳动难度适中,不算很大,字节的笔试挂了。其实这次感觉自己做的也不是挺好哈哈哈。

1、题型

笔试分为三部分:20道单选题 + 10道不定项选择 + 2道编程题

2、题目

选择题

1. one-vs-rest
题目是让选择对用one-vs-rest思想进行n分类,需要几个分类器。
一开始还不知道原来one-vs-rest就是one-vs-all,但是后来排除了就剩下n个分类器这个答案了。
one-vs-all(one-vs-rest):利用n个二分类器完成n分类的任务。2.sigmoid、TaNh、ReLU
题目是选择哪个函数有可能是输出为-0.01的神经网络的激励函数。
其实题目很简单利用函数的值域就能解出来,但是利用这个机会去理一理这三个函数的区别吧。
神经网络中的激活函数3、bootstrap原理
题目是选择boostrap的原理。主要是要学会区别与其他集成学习算法的原理。
bootstrap: 集成学习中的一个算法,是一种估计统计量的重采样方法,从大小为n的原始训练数据集D中随机选择n个样本点组成一个新的训练集,这个选择过程独立重复B次,然后用这B个数据集对模型统计量进行估计(如均值、方差等)。由于原始数据集的大小就是n,所以这B个新的训练集中不可避免的会存在重复的样本。4、正负样本不均衡的解决办法
题目是用采样方法去缓解正负样本不均衡的解决办法。
采样分为上采样(Oversampling)下采样(Undersampling)
上采样是把小众类复制多份;下采样是从大众类中剔除一些样本,或者说只从大众类中选取部分样本。

上采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点。为了解决这一问题,可以在每次生成新数据点时加入轻微的随机扰动,经验表明这种做法非常有效。
因为下采样会丢失信息,如何减少信息的损失呢?
第一种方法叫做EasyEnsemble,利用模型融合的方法(Ensemble):多次下采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。
第二种方法叫做BalanceCascade,利用增量训练的思想(Boosting):先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,然后对这个更小的大众样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。
第三种方法是利用KNN试图挑选那些最具代表性的大众样本,叫做NearMiss。

5、至于剩下的题目也不太记得了,主要是一些关于p值还有零假设检验的合理性。看来还是需要补一补统计学的知识。

编程题

数据挖掘考的大题是编程题,同学数据分析考的是sql题。还好看了点往年的题型最近练习的侧重点是编程,虽然说sql语句以后也会考到,找个时间猛补吧。

1、排序题
题目描述不大记得了,主要是:给出一组数字,让你从这组数中找出最长的递增数列长度。
比如:

输入:
10, 9, 2, 5, 3, 6, 7, 4, 9, 8, 101, 18
输出:
6
提示:
1、该递增数列是 2, 3, 6, 7, 9, 101
2、该递增数列在原数列中不一定是连续的。

我的第一时间想法就是先去重排序(去重是因为相同的数字不算递增,所以重复的数字不影响),然后就得到了已经排序号的数列,但是这些数列是在原数列有排序的,所以只要判断去重排序中的元素在原数列中的索引是否递增就能找出答案。但是在实际通过样例只有83.3%,搞不懂是不是漏了一些条件,明天去班里问问ACM大神吧。

data = [10, 9, 2, 5, 3, 6, 7, 4, 9, 8, 101, 18]
sortData = sorted(list(set(data)))
count = 0
for i in range(1, len(sortData)):
    if data.index(sortData[i]) > data.index(sortData[i-1]):
        count += 1
print(count)

上课的时候问了一下学过算法的同学,说我写的代码不对,只是凑巧达到了一些案例的标准。
这题用的方法是静态规划,目的是用dp[n]:以第n个数字结尾的上升序列的长度。

data = [10, 9, 2, 5, 3, 6, 7, 4, 9, 8, 101, 18]
dp = [1 for i in data]
for i in range(1,len(data)):
    for j in range(i):
        if data[i] > data[j]:
            dp[i] = max(dp[i], dp[j]+1)
        dp[i] = max(dp[i], 1)
print(max(dp))

第二题稍微忘了题目了,等拿到真题再完整的更新一次吧。
把每一次笔试都当作查漏补缺,加油。

相关推荐