2019年校招:万得信息AI算法工程师

AI算法工程师

分为笔试与面试:
笔试题目:

请设计一个热门股票榜单,使其能够实时的反映当前股票市场对各支股票的关注度。
可使用的数据:包括但是不限于用户访问股票的日志行为记录等。

请描述:如何选取数据、数据预处理、构造特征、选择算法,以及如何对效果进行评估?
答:

>>

理论:

  1. 理解实际问题,抽象为机器学习能处理的数学问题
    理解实际业务场景问题是机器学习的第一步,机器学习中特征工程和模型训练都是非常费时的,深入理解要处理的问题,能避免走很多弯路。理解问题,包括明确可以获得的数据,机器学习的目标是分类、回归还是聚类。如果都不是的话,考虑将它们转变为机器学习问题。参考机器学习分类能帮助从问题提炼出一个合适的机器学习方法。

  2. 获取数据
    获取数据包括获取原始数据以及从原始数据中经过特征工程从原始数据中提取训练、测试数据。机器学习比赛中原始数据都是直接提供的,但是实际问题需要自己获得原始数据。“ 数据决定机器学习结果的上限,而算法只是尽可能的逼近这个上限”,可见数据在机器学习中的作用。总的来说数据要有具有“代表性”,对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。不仅如此还要对评估数据的量级,样本数量、特征数量,估算训练模型对内存的消耗。如果数据量太大可以考虑减少训练样本、降维或者使用分布式机器学习系统。

  3. 特征工程
    特征工程是非常能体现一个机器学习者的功底的。特征工程包括从原始数据中特征构建、特征提取、特征选择,非常有讲究。深入理解实际业务场景下的问题,丰富的机器学习经验能帮助我们更好的处理特征工程。特征工程做的好能发挥原始数据的最大效力,往往能够使得算法的效果和性能得到显著的提升,有时能使简单的模型的效果比复杂的模型效果好。数据挖掘的大部分时间就花在特征工程上面,是机器学习非常基础而又必备的步骤。数据预处理、数据清洗、筛选显著特征、摒弃非显著特征等等都非常重要,建议深入学习。

  4. 模型训练、诊断、调优
    现在有很多的机器学习算法的工具包,例如sklearn,使用非常方便,真正考验水平的根据对算法的理解调节参数,使模型达到最优。当然,能自己实现算法的是最牛的。模型诊断中至关重要的是判断过拟合、欠拟合,常见的方法是绘制学习曲线,交叉验证。通过增加训练的数据量、降低模型复杂度来降低过拟合的风险,提高特征的数量和质量、增加模型复杂来防止欠拟合。诊断后的模型需要进行进一步调优,调优后的新模型需要重新诊断,这是一个反复迭代不断逼近的过程,需要不断的尝试,进而达到最优的状态。

  5. 模型验证、误差分析
    模型验证和误差分析也是机器学习中非常重要的一步,通过测试数据,验证模型的有效性,观察误差样本,分析误差产生的原因,往往能使得我们找到提升算法性能的突破点。误差分析主要是分析出误差来源与数据、特征、算法。

  6. 模型融合
    一般来说实际中,成熟的机器算法也就那么些,提升算法的准确度主要方法是模型的前端(特征工程、清洗、预处理、采样)和后端的模型融合。在机器学习比赛中模型融合非常常见,基本都能使得效果有一定的提升。这篇博客中提到了模型融合的方法,主要包括一人一票的统一融合,线性融合和堆融合。


面试涉及的主要问题:
  • 今日头条的热搜榜单是根据什么特征来排序的,或者说你认为他是如何来排序热搜的?

答: 编程思想:每个被搜索的词条都是一个结构体,所有的被搜索词条构成了一个结构体数组,也就是一个线性结构。被搜索词条这个结构体中有两个成员变量,一个是用于存放搜索次数的整形变量sum,sum要被赋初值为0;另一个是用于存放关键词的字符串key

将每次用户的输入分成两种情况,第一种情况是之前已经被搜索过的关键词,第二种情况则是之前从来没有被搜索过的关键词。若是第一种情况则让该词条的搜索次数自加1;若是第二种情况则要将新的用户输入作为新词条存储到由被搜索词条构成的结构体数组中,并让该新词条的搜索次数自加1,此时该新词条的搜索次数由初始化后的0变为1。

经过一系列的搜索操作,每个被搜索的词条都有了一定的搜索次数,最后运用选择排序法或者其他排序算法根据搜索次数由多到少将词条进行排序,一个热搜排行榜便在不知不觉中形成了。

参考代码

#include 
#include 
#include 
//声明结构体:词条keyw
typedef struct
{
    //用于存放搜索次数
    int sum;
    //用于存放关键词
    char key[20];
}keyw;
//num为被搜索词条的总数
int num=0;
//被搜索词条的上限是1024条
keyw keywo[1024];
//自定义函数的声明
void input(keyw *x,char str[],int *num);
void show(keyw *x,int num);
 
int main(){
    //choice为用户的热键
    int choice;
    //keywords为用户的输入内容
    char keywords[20];
    //给所有被搜索词条的搜索次数赋初值0
    for(int i=0;i<1024;i++)
        keywo[i].sum=0;
    /*------------------------------启用菜单------------------------------*/
    system("cls");
    system("color f0");
    do{
        //程序功能展示菜单
        printf("\t\t\t欢迎使用LittleBox搜索引擎!\n");
        printf("*************************************************************************\n");
        printf("\n搜索请输入1\t\t查看热搜榜请输入2\n\n");
        printf("退出程序请输入0\n\n");
        printf("*************************************************************************\n");
        printf("请输入您的选择:");
        scanf("%d",&choice);
        fflush(stdin);
        switch(choice){
        case 1:
            printf("请输入搜索关键词:");
            scanf("%s",keywords);
            //此时搜索词条数+1 若为被重复搜索的关键词 则在input函数中让其值-1
            num++;
            input(keywo,keywords,&num);
            break;
        case 2:
            show(keywo,num);
            break;
        case 0:
            printf("\n您已成功退出!\n");
            //正常退出程序
            exit(0);
            break;
        default:
            printf("\t\t\t对不起,您的选择有误,请重新输入!\n");
        }
        system("pause");
        system("cls");
    }while(1);
	return 0;
}
 
//自定义函数的实现
 
/*
传入的参数为:
由所有被搜索词条构成的kwyw型(自定义类型)的线性结构
输入的内容str
被搜索词条的总数num的地址
*/
void input(keyw *x,char str[],int *n){
    //flag用于判断输入的内容是否为被重复搜索的关键词
    int flag=0;
    int i;
    for(i=0;i<(*n)-1;i++)
        if(strcmp(x[i].key,str)==0){
                //此时用户输入为被重复搜索的关键词
                //让被搜索词条数-1
                (*n)--;
                //该词条的搜索次数+1
                x[i].sum++;
                flag=1;
                break;
            }
    if(flag==0){
        //此时用户输入为新的关键词
        //将用户输入作为新词条存储到线性结构上
        strcpy(x[*n-1].key,str);
        //让新词条的搜索次数+1
        x[*n-1].sum++;
    }
}
/*
传入的参数为:
由所有被搜索词条构成的kwyw型(自定义类型)的线性结构
被搜索词条的总数num
*/
void show(keyw *x,int num){
    int i,j;
    keyw t;
    //用选择排序法根据搜索次数由多到少将词条进行排序
    for(i=0;i

参考:
1、各大平台热搜排行榜原型
2、一个完整的机器学习过程


先挖个坑,待我查阅资料先。。。。

你可能感兴趣的:(算法)