1. 程式人生 > >(更新)資料探勘,自學一年拿了騰訊京東華為網易YY的Offer,方法與建議

(更新)資料探勘,自學一年拿了騰訊京東華為網易YY的Offer,方法與建議

成果

秋招結束了,我最終獲得了:

  • 騰訊
  • 京東
  • 華為
  • 網易遊戲
  • 歡聚時代
  • 搜狐視訊

這幾個offer,均待遇不錯,收穫頗豐。

寫作動機

回想起一年多以前選擇資料探勘的時候,一度以為找不到工作,非常著急。幸好有令科,梅寒,志韜等師兄為我解答了很多迷津。於是也嘗試記錄一下自己的學習歷程,鑑於往事,以資於後道。
全文分成6個階段,文章有點長,各位可以直接去看自己的那個階段,看看我過去的心路歷程和總結的經驗能否幫上忙。
暫時寫到找實習,其他部分想到再寫,有什麼問題可以微信問我,我在實驗室群裡
所有技巧僅適用於我們實驗室

  • 我們實驗室的一個特點是人多。
    很多優秀的師兄師姐,他們就像排頭兵,考慮過你現在迷惘的幾乎所有選擇,去過了幾乎所有重要和優秀的公司,就職於所有欣欣向榮的崗位,能帶給大家很多前路上的指引。
    請大家多點跟所在的小組現在的前輩,還有以前畢業了的前輩多多交流,他們會最切身,熱情地幫助你任何困惑。
  • 我們實驗室的第二個特點,是有很多優秀的師弟師妹。
    以後你們的苦惱也會變成後輩的參考,你們走過的路也可能成為後輩的選擇。為了讓你們努力得到的經驗不要只被自己使用一次,為了讓更多後輩追隨你的腳步壯大隊伍:
    請多點分享,任何形式的都可以:書,部落格,Github,私下聊天…..

這是我的微信,有什麼問題我們都可以一起探討

階段

1. 選方向階段

我的研究生是兩年制,於是在大四暑假的時候,我必須對學習方向做一個選擇,到底學C++後臺還是資料探勘。
我的情況是:

  1. C++

    • 實驗室有與之相關的專案
    • 本科的時候有學過C++程式設計
    • 關係比較親近的師兄都去了做C++後臺
    • 全社會招的人不少,但是作為一個有相當歷史的崗位,競爭者也不少
  2. 資料探勘

    • 比較感興趣
    • 完全沒有基礎
    • 當時剛開始流行,很多人在學習,可以一起學習
    • 不需要什麼專案經驗,但是需要參加比賽

糾結了很久,最後還是去做了資料探勘:

  • 實在不喜歡程式設計
  • 對自己家庭情況做了分析(不需要非常穩定地掙錢,家裡人不用我養)
  • 對自己的工作狀態做了分析(不擅長做太細節的工作)
  • 資料探勘即使沒學成,起碼能做Python工程師,也比C++舒服(這個設想後來無法證明正確與否,好像是錯的)

綜合上述情況,心裡比較不討厭資料探勘,所以選擇學習資料探勘。

2. 學習階段

  • 買盜版書:
    儘可能多的獲取資訊,雖然網課也很好,但是很多書裡的內容更詳細和pratical,因為沒有錢,但是又想買各種書來看,上知乎看了一圈不知道買什麼,就在淘寶搜“滿三包郵”買了一堆盜版書,不能因為貧困而不學習。大家一定不要學我。

    看下來每一本書都有各自的閃光點,相互補充效果很好,書有點多所以書架放在了語音組實驗區,大家可以借閱或捐贈。
  • 學習路徑:

    • 基礎技巧:Python做資料分析
    • 初學者入門:Python資料探勘與實戰
    • 第一次自己上手:kaggle
    • 實際做比賽:天池/CCF
    • 有問題:stackoverflow/Github
  • 請大家關注一些很有用的企業公共KM(知識分享),我這裡推薦三個:

    • 騰訊雲
    • 阿里技術(微訊號:ali_tech)
  • 機器學習的學習方法:先學會一些常用數學,統計,思考方式等工具。然後理解新的模型的“步驟”(當有工具的時候,大概瞭解在數學上和哲學上這些模型是怎麼構築的就行,詳細的證明當數學熟練後可以推出)

  • 【2018.1.30更新】最近在補全自己深度學習的知識,學習深度學習的話,我建議的路徑是這樣的:

    1. 基礎:
      買,並看《Deep Learning》準備一些數學,深度學習方面的基礎,英文不好可以看中文版,但是中文版翻譯越到後面越糟糕,所以看到後面可能你會自動去看英文版。
    2. 選擇一個領域並準備基礎:
      影象/語音/NLP…並買一些對應領域的專著來看,每個領域都有一些基礎知識,這些知識論文中不會講,部落格網文太零散,必須看書。
    3. 學習深度學習框架:

      • Tensorflow: 我把市面上(2018.1月)有關Tensorflow的書都買過一遍,我建議先看《面向機器智慧的Tensorflow實戰》有興趣再看《Tensorflow機器學習實戰指南》
      • PyTorch: 看得不多,我覺得《深度學習入門之PyTorch》挺好
      • 具體選擇哪個框架當然看你領域的研究需要,不過我們公司用TensorFlow比較多,所以必知必會
      • 學習列表:這個表應該有三行,包括了你這個領域常見的技術,分成“模型”,“模組/技巧”,“其他”,可以看我的例子:

        a. 模組/技巧:重引數化,因果卷積 ,highway,attention
        b. 模型:SampleRNN,WaveNet,Griffin-Lim
        c. 其他:MCMC取樣,BeamSearch

      必須學習原理(在Arxiv找論文),和實現(Github找實現)。三層的關係層層遞進,學會了寫第一層的模組,你就可以學搭第二層的模型,第三層是其他,不屬於模型或者模組,但是按照結構主義的觀點,所有功能都有對應的結構,第三層只是用來存放雜物的。

    4. Github:關注你們對應領域的大佬,看他們會star什麼專案,你也跟進去學習
  • 寫自己的部落格。認識有偏差也沒關係,太張狂也沒關係,根據Fail-Fast原則,越早地把問題暴露出來,越好,比如我就會寫:

    • 機器學習的學習方法:
      先學會一些常用數學,統計,思考方式等工具。然後理解新的模型的“步驟”(當有工具的時候,大概瞭解在數學上和哲學上這些模型是怎麼構築的就行,詳細的證明當數學熟練後可以推出)

    很遺憾,沒有人來指正我的錯誤,糾正我的人腦神經網路中的bias,畢竟大家都很忙,有人肯花時間在你文章底下罵你應該很感謝才對

關於比賽:

  • 找到一起學習的隊友
    跟煥波和喬銳一起打了比賽,也獲得了陽星,梅寒,令科師兄的指導,有隊友的時候因為頻繁交流促進思考,各有分工也避免多路作戰,對每個人的進步都會很快。我們實驗室很多人打比賽,可以隨意找人組隊,也鼓勵組與組之間的交流,一起學習。
  • 選擇比賽的時候,儘可能多方面考慮:
    • 除了比賽難不難,還要考慮舉辦比賽的公司,找工作時找回原公司會有很大優勢
    • 考慮舉辦比賽的型別,做過醫療AI的比賽,找對應的公司有優勢
    • 很有難度的比賽,也不一定要達到很高的名次,但是名次低的時候就不要死磕,儘可能在技術上有所創新,寫簡歷的時候也會有料
  • 要有人負責混群和討論區瞭解最新技巧
  • 集中整理記錄比賽的時候的筆記,找工作的時候有用
  • 面試官100%問這個問題:幾個人?怎麼分工的?
  • 其他關於比賽的問題請問煥波,博翰這些比賽大佬吧

以下是煥波貢獻的關於比賽的建議:
(12月7日更新,其他朋友想一起編輯的請微信聯絡)

  1. 進階
    kaggle平臺上的kernel、discussion部分,會有很多人分享比賽的程式碼。可以找那種已經開始了半個月到一個月的比賽,這時上面已經有很多開原始碼。在這些開源的基礎上跟著繼續做,上手會挺快的。

  2. 比賽的選擇:
    現在許多公司都在舉辦比賽,但是這些比賽良莠不齊,很多比賽的資料有問題,所以選擇一些質量高的比賽就很重要。

    • 儘量打大公司的比賽,許多公司舉辦比賽就是為了招人,大公司的比賽一般認可度比較高。其次是大公司一般舉辦比賽時投入的資源也比較多,對於資料的質量也更有保障。

    • 現在的比賽基本就是4類,分類、迴歸、影象、nlp。對於新手來說,一開始建議選擇分類的比賽,相比迴歸這類容易上手。而影象、nlp這些需要一定的領域知識,如果之前沒有接觸過,難度還是比較大的。

    • 比賽的資料也是很重要的因素,最主要是由於資料質量不高,導致隨機性很大,線上線下不同步。比如之前天池上有一個社保比賽,樣本只有幾千個。線上線下不同步,隨機性特別大。對於這類比賽還是儘早棄坑。

  3. 所需工具:
    現在比賽除了天池平臺的線上賽需要使用sql外,其他平臺對使用的工具都沒有限制。常用的就是python、pandas、xgboost、sklearn等。pandas的學習可以參考o2o的程式碼還有pandas官網文件。sklearn可以直接看官網的文件,還有一本書《python大戰機器學習》,對於sklearn的使用介紹得挺不錯的。

3. 找實習階段

2016年11月,因為網易遊戲推出了一個叫“預踐未來”的非常規實習計劃,這個計劃中都是“某個工作室需要一個功能,找個人來做吧”這種臨時工性質的任務,此次放出的計劃沒有太多宣傳,是師兄告訴我的,當時還沒什麼人投。
我本科的時候做過語音於是便投了簡歷,結果便錄取了其中一個語音的專案,錄取後很快就來問什麼時候能去實習了,我因為當時實在來不及於是便說之後再去,公司那邊說“那我們會繼續招聘,如以先到者優先錄取哦”。
我說好吧,後來實習了幾個月,獲得了offer。
回校專心刷題,到8月剛好準備充足地參加秋招。

我個人認為的要點是:

  • 如果能力過關,儘早投實習崗位,而且儘量要投好公司:
    • 好處:適合怕找不到好工作的同學
      等到3月統一春招實習的時候,就要跟全國各大學校的大佬競爭了,但是企業對實習生的需求不是3月份一夜之間冒出來的,在那之前已經有需求了,3月統一招聘可以降低宣傳成本。吸引更多優秀人才報名——對我們學生來說競爭就更激烈了。
    • 壞處:萬一實習錄取了,就錯過了3/4月各大公司找實習的時候
      這個時候要不要辭職找實習就成為糾結了,所以一定要投好公司。
  • 注意實習時間:
    正常的實習時間是3月招聘,4月/5月入職,實習最低兩個月,8月份秋招已經如火如荼了,所以儘早入職的話,還有時間回來準備刷題秋招
    (就我自己的情況,”實習的時候學的東西+實習的時候抽空複習的東西”是不夠應對秋招的,必須刷題)
    建議最好不要6月中才入職,因為起碼實習到8月中,萬一實習的公司不發offer就傻眼了

  • 實習的地域優勢

    • 很多同學找實習的時候會因為實驗室有事等原因無法去外地實習,這對於外地的學生也是一樣的,所以找實習的時候企業會優先錄取本地學生,所以儘可能投本地最好的企業
    • 我的意思就是,記得投WXG,網易遊戲,他們會優先錄取你,特別是“特殊專案”
    • 進去了門檻高的企業再跳就很簡單,這個道理跟高考中戶口的作用一樣,不懂的代進高考思考一下
    • 這條可以反過來用,請代進“異地高考”考生這件事來想
  • 什麼叫能力過關就去實習:
    一個公司要人的標準,實習生比校招生的要求會降低10~20%,但是總體差不多,所以提前投簡歷,參加面試,也可以知道自己缺陷在哪。
    3月之前用野路子提前找實習的時候可以大膽的投,掛了就掛了,這種不會進檔案的,最多不行3月再投。

  • 多瞭解一些旁門左道的實習路子:
    • 哪裡缺人就去哪,公司的需求跟你做過專案對口了就會降低其他方面的要求錄取你
    • 每週刷一次各大公司招聘網站:
    • 推薦一些會招聘實習的公眾號:
      • 互聯派
      • 網際網路offer之路
      • 校招導師
      • datawork
      • paperweekly
    • 大街網/獵聘網/看準網/脈脈,這些網站可以關注一下,但是直接投簡歷成功率不高
    • 投簡歷的時候託師兄幫你內推簡歷,可能的話直接扔到HR手中(注意:內推的時候越靠師兄,實際上就越是把師兄和你的信用作為抵押,成功率也越高,萬一錄取了你之後你不去,那麼有時候師兄會有很困擾)
  • 機器學習的實習和找工作,基本上C++這一塊只要看《劍指offer》並熟悉其中題目,機器學習那一塊就看各自領域了
  • 雖然有很多說法說簡歷不要寫太長,但是如果是線上簡歷,是沒有太多人會在意你是不是剛好一頁A4紙的。當然在重點寫清楚的情況下,越簡短越好。

以下是11月27日更新:

4.筆試階段

  • 我這裡注重說一些自己琢磨的別人很少說的點,筆試常見的演算法請上網刷題。(牛客網足夠應付一般的筆試了。有空都刷了是沒錯,但是注意看看牛客上的各大企業往年題。刷的題夠用就好,別浪費太多時間)

  • 雖然可能有點朋友已經知道了,但是還是提一下:因為筆試題跟ACM很像,所以多點搜尋借鑑ACM大佬的經驗技巧,例如下面這些:

  • 比如,看答案的時候,會看到ACM的大佬們在一些不需要用到algorithm標頭檔案的程式碼中,也include了algorithm,證明對於筆試題他們會寫一個模板,做題之前直接複製上去先,像這樣:

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
using namespace std;
int popMaxInVector(vector<int>&vec)
{//彈出vector中最大的元素
    vector<int>::iterator maxElementIt = max_element(vec.begin(), vec.end());
    int maxInt = *maxElementIt;
    vec.erase(maxElementIt);
    return maxInt;
}
int main()
{
    int n = 0;
    int m = 0;
    int ans = 0;
    int data = 0;
    scanf("%d %d", &n, &m);//讀入引數
    int count = 0;
    int* A = new int[n];
    //vector <int>A;
    //vector<int>::iterator max_it = max_element(A.begin(), A.end());
    while (count<n)
    {
        scanf("%d", &data);
        A[count++] = data;
        //A.push_back(data);
    }
    //while (i<maxLineNum)
    //{//讀入n行的輸入
    //    gets_s(lines[i++], maxLineLen);
    //}
    ////gets讀取一行
    //提取所有數字:scanf("%[1234567890] ", strings);
    //不提取所有數字:scanf("%[^1234567890] ", strings);
    ans = countingM(A, n, m);
    printf("%d", ans);
    return ans;
}
  • 熟悉你使用的平臺的輸入輸出格式。比如阿里只能用 scanf和printf,牛客和賽碼可以用cin和cout,對於python2和3的輸入輸出處理也有不同(比如python3的map返回的是個map物件,而python2中返回一個list)

  • 之前做筆試的時候總結了一些技巧,包括上面寫的幾個,直接看吧

以下是11月21日更新:

5. 面試階段

  • 自我介紹的時候針對技術面和HR面設計不一樣的自我介紹
  • 不要總是等著面試官問,在面試官問完一個專案之後,可以開啟你紙質版的簡歷(沒錯,這就是為什麼即使有了網頁版的簡歷,你還應該帶上紙質版簡歷的原因),把重點的專案指給他看,並簡單介紹一下“這個專案我也學到了很多,特別是XXX和XXX的處理”
  • 最好要有自己的見解,不能照搬網上的回答,必須答出本質一點的區別。
    比如,一個常見問題就是“XGBoost和GBDT的區別是什麼?”這個時候可以從框架上討論:“統計學習的三要素框架”,從隱含的思想上討論“XGB引入了殘差學習和梯度衰減的思想”等。
    面試的時候針對這種“區別型”題目有一套分析框架,根據這個分析框架去思考和補充知識,那麼能給面試官“很厲害”的印象
  • 沒有太多見解的情況下,可以考慮借用我這篇文章裡的框架:
    XGBoost模型跟Logistic Regression模型的本質區別
    這些是我自己想出來的,當然不一定是正確的,但是起碼令我知道自己的不足,花時間翻源演算法和程式碼,並使得面試官有特別好的印象。如果沒時間準備了,那麼可以只准備一個最常見的問題,並伺機主動提出。
    【比如LR,比如XGB,都是高頻問題】
    【聽說X科師兄就是用自己的見解打動BTH三家公司並都拿了sp哦】
  • 要有自己的見解還有一種稍微偷懶的方法,參考。比如XGB,可以翻閱對應領域針對XGB的優化的論文,領會了之後,你可以說”我在比賽的時候,針對XXX問題,對XGB進行了這樣的改進“,這樣就使得你好像自己有所領會,面試官沒問你”是不是參考的別人”的話,你也不用跟他說,問了再說就是了。
  • 整理好自己的Github和部落格,關於“我沒有github專案”,“如何把github打扮得專業一點”請看這個文章:
    技術面試中常被問到是否參與開源,那如何清晰展示 GitHub 專案呢?
  • 關於“你有什麼問題要問我嗎?”想不到有什麼問題的話,建議問一下“請問您的小組的業務是怎樣的”你這樣問了的話,有很多好用的套路

    • 獲取面試結果:如果面試官只是草草回答,那麼可能證明你”沒通過面試”
    • 獲取部門資訊:如果這個部門的業務你聽了就不想去,那起碼可以提前知道。一般面試官的回答會有誇大成分,可以找師兄查一下那個小組具體怎麼樣,存在感如何,有沒有大佬帶等。
    • 猜下一次面試的面試題:知道了是什麼部門下的哪個小組,然後就在獵聘查一下這個小組社招的需求,上其小組的網站/公眾號找他們最近發表的文章,論文等。然後按照這些需求準備二面。
      比如,面騰訊一面的時候,我得知一面面試官是MIG下面一個測試中心的,然後我查了這個中心的公眾號和網站,包括社招,然後針對自己做過的專案調整簡歷,寫”標題看起能吸引這個中心的人的”部落格,然後再去二面。準備萬全。
    • 表現出自己的熱情和興趣:面試官想要你的話,會詳細介紹,並描繪”我們小組多麼多麼厲害”,這個時候你既可以說”我對這個也很感興趣,我以前就做過/學過類似的專案”,也可以一起吹捧一番說”聽起來很好,這個產品的裝機率這麼高,超過今日頭條肯定沒問題,畢竟我們(這裡拉近你跟面試官的距離,聽起來就已經是同事的關係了)有渠道優勢!”
  • 坦白說,如果面試官完全不知道你的專案是怎麼樣的,光靠說的很難講清楚。最好把自己做過的專案做出流程圖,面試的時候用平板或者打印出來,展示的時候非常直觀。網易實習語音分類專案流程圖

  • 如果是線上簡歷,可以一面後馬上改簡歷,以適應二面,比如發現簡歷裡有漏洞或者不清楚的地方,一面的時候被抓著問了,那麼可以考慮面完馬上刪掉。還可以針對面試官所在的小組,把簡歷修改得更匹配對應職位

以下是11月27日更新:

  • 面試的時候要帶的東西
    • 溼紙巾: 碧柔 可變香味爽身粉溼紙巾 【面騰訊用上了】
      含有爽身粉,烈日下一身大汗趕到面試現場,掏出來擦一下就可以恢復乾爽
    • 耳罩: 3M optime 105耳罩 【面騰訊用上了】
      騰訊的御用面試酒店是東圃喜來登,面試等待的時候整個大堂都是人,焦急焦慮和現場的吵鬧讓人無法安靜複習,掏出這個適合在105分貝下使用的耳罩,馬上讓心思安靜下來。也可以用在趕面試的車中使用,別睡過頭了就好
    • 零食:【面京東用上了】
      今年可能是京東第一次來廣州面試,定在一家環境很一般的酒店,而且約的4點半面試6點還沒面上,飢腸轆轆只想吃飯,沒有心思跟面試官討論Dropout和BatchNorm了,這個時候就需要零食充飢,遞給身旁一起等面試的朋友,也是交友的利器(後來我去面YY的時候又見到了這個大哥,其實整個廣州這一塊的畢業生有幾個,跑面試的來來回回都是那些人)
    • 鉛筆:【春招面騰訊用上了】
      面試官讓寫程式碼,沒想好就胡亂寫的話,反而讓草稿紙髒兮兮的。先寫虛擬碼,寫測試用例,然後用鉛筆在上面修改,寫批註,最後想好了一氣呵成

5. 實習階段

  • 實習任務一般是個很小的點,但是你要把它做大,擴充套件功能,提高穩定性,提供效能界資訊,提高通用性
  • 想到再慢慢寫吧

以下是11月21日更新:

  • 多認識裡面的大佬,即使你不留在那個公司,也能給你一些人生建議,買賣不成仁義在
  • 多認識同期的實習生,到時候秋招的時候相互分享經驗,討論offer,甚至一起打遊戲都很有用

以下是11月27日更新:

  • 多看透公司內部的情況,比如:

    • 大多數員工是哪裡跳過來的
    • 晉升速度
    • 部門的好壞(跳走和跳來率)
  • 跟正式員工對比,發現自己不足的部分,如果明天你們的工作崗位交換了,能否勝任?為什麼?

6. 選工作階段

  • 如果沒有“親人重病急需現金”“我媽說我留在XX就給我一套500w的房子”這樣重磅的硬理由,選你喜歡的就好。
  • 不要想太多,你喜歡做,不管大公司小公司,起碼比較開心,開心了成長了,自然可以選公司
  • 我們學習十一月初才發三方,所以在那之前都可以慢慢考慮

以下是11月21日更新:

  • 認清楚自己的風險偏好型別很重要。因為我是風險中性型的人,家在廣州,沒有太大欲望,所以我建議選擇“在產生的最壞結果能承受的前提下,收益最大”的路線。但是有的人可能會覺得不選擇風險最大的路徑是浪費機遇,每個人所處的環境不一樣,各自人生的起點和終點不一樣,選擇適合自己的最重要。我們之所以相遇,你看到我的文章,只是因為我們剛好碰巧做了2年同學,偶然當了一段時間同路人,除了珍惜這段緣分之外也不要對其他人的選擇做太多幹涉才好。

以下是11月27日更新:

  • 成長第一,但是也要看好自己的其他可能性。
    可以搜尋“京東跳槽”之類的東西瞭解想去的公司一般跳去哪裡,實際上京東推薦很多情況下是跳去阿里,回廣州頂多是唯品會,如果家在廣州可能以後還會回來的話(不買房畢竟少很多支出),就需要三思

一家之言,如果有任何建議請各位師兄師姐師弟師妹指正,無任歡迎