<nav id="w0g0m"><code id="w0g0m"></code></nav>
  • <xmp id="w0g0m">
    <xmp id="w0g0m"><nav id="w0g0m"></nav><menu id="w0g0m"><strong id="w0g0m"></strong></menu>
  • <xmp id="w0g0m">
  • <nav id="w0g0m"></nav>
    <menu id="w0g0m"><menu id="w0g0m"></menu></menu>
    1. 網站地圖
    2. 設為首頁
    3. 關于我們
    ?

    大學生信息管理及就業預測系統的設計與實現

    發布時間:2022-12-25 11:22
    目錄
    第一章 緒論 1
    1.1項目背景 1
    1.1.1信息管理系統 1
    1.1.2就業難度增大 1
    1.1.3就業難度增大的形成原因 1
    1.1.4就業現狀 2
    1.2現有技術的發展現狀 3
    1.2.1人工神經網絡發展現狀 3
    1.2.2推薦系統發展現狀 4
    1.3本文的研究意義 5
    第二章 需求分析與項目基礎 7
    2.1用戶實際需求描述 7
    2.2用戶用例需求描述 8
    2.2.1用戶劃分 8
    2.2.2用戶用例分析 8
    2.3業務流程分析 9
    2.4項目需求 9
    2.4.1總體需求 9
    2.4.2功能需求 11
    2.5系統開發相關技術 13
    2.5.1MySQL 13
    2.5.2Java 14
    2.5.3Python 16
    第三章 系統總體設計 18
    3.1系統總體架構 18
    3.2數據庫的架構 19
    3.3數據流圖 20
    3.4就業推薦工作流程 20
    第四章 信息管理模塊的設計與實現 22
    4.1引言 22
    4.2前端頁面的設計 23
    4.3數據庫設計 24
    4.3.1數據庫 ER 圖 24
    4.2.2數據倉庫表設計 26
    4.2.3數據字典 27
    4.2.4類對象設計 30
    4.2.5后端實現 33
    第五章 就業推薦引擎的設計與實現 41
    5.1引言 41
    5.2數據預處理 42
    5.2.1預處理的重要性 42
    5.2.2預處理步驟 42
    5.2.3第三方數據來源 43
    5.2.4數據清洗舉例 44
    5.2.5特征工程舉例 46
    5.3推薦模型 53
    5.3.1XGBoost 推薦模型 53
    5.3.2Wide&Deep 模型 57
    5.3.3模型融合 61
    第六章 系統的設置與測試 63
    6.1實驗設計 63
    6.2實驗數據 64
    6.3實驗步驟 67
    6.4實驗結果 70
    6.4.1信息模塊實驗結果 70
    6.4.1推薦引擎實驗結果 81
    第七章 總結與展望 82
    7.1總結 82
    7.2展望 82
    致謝 83
    參考文獻 84
    第一章 緒論
    1.1項目背景
    1.1.1信息管理系統
    信息管理系統作企業和高校不可缺少的工具之一,提供了科學、安全、高效 地信息管理功能。我們正處于一個信息過載的時代,每時每刻都有海量的數據產 生,而信息系統作為最基本的信息處理手段,廣泛地應用于各種領域,為企業提 供了一種高效管理的手段。對于高校而言,學生信息的管理尤為重要,它可以幫 助高校統一、集中、高效地管理學生數據,并能快速地從數據中提取有用的信息, 以教學和就業為目的進行建模,最終實現最大化教育水平以及增加畢業生就業率。
    1.1.2就業難度增大
    匹配勞動力的需求和供給一直是一個很困難的問題。自2008 年以來,全球金 融危機加劇了中國應屆大學畢業生就業壓力。在需求方面,經濟增長率下降伴隨 著國內需求下降,其中勞動需求下降主要出現在制造業、出口導向型實體以及服 務部門。在供給方面,大學的數量因入學人數不斷增加,中國的畢業生發展迅速。 自20 世紀90年代末以來的教育局統計顯示,到 2009年中國的大學畢業生達到610 萬人,2018 年更是達到了 820 萬人,近半數求職者認為求職有難度,不可謂壓力 不大。
    1.1.3就業難度增大的形成原因
    經濟合作與發展組織已經強調了青年與整體失業率之間差距的大小,特別是 在一些歐洲國家。因此,聯合國教科文組織的一份文件強調,雖然高等教育學生 人數增加,但必須更加重視畢業學生技能的質量及其與現實世界工作場所需求的 關系[15],這是為了應對未來的就業壓力。近年來,中國的高等教育改革不斷,高 等教育從“精英”到“大眾化”,導致大學生人數迅速增加。此外,目前中國整體 就業形勢嚴峻,受世界經濟的影響,大學生就業狀況低迷。同時,由于生產部門 的勞動力需求大幅減少,許多企業大量裁員和縮小規模,工廠破產增加了剩余勞 動力的社會壓力,這個問題近年來尤為突出。另一方面,自 1999年中國高校擴招 以來,越來越多的大學畢業生以 23%的年均增長率加劇了就業狀況[16,17,18,19,20]。中 國的地方大學作為中國高等教育體系的重要組成部分,在培養人才和解決畢業生 就業問題方面發揮著舉足輕重的作用[21]。
    1.1.4就業現狀
    2016年調查發現,87.5%的畢業生認為就業狀況一般,只有 6.3%的畢業生認 為 2016 年的就業狀況嚴重,這表明大多數畢業生的對于就業現狀不了解。民營企 業,中小企業,二三線城市的畢業生需求明顯增加,與此同時一線城市的大型央 企和跨國企業的畢業生需求趨于穩定。這一社會需求的現狀與畢業生就業期望存 在明顯差異。在制定正確的職業規劃問題上,40%的畢業生認為對他們來說非常 必要,50%的畢業生認為幫助不明顯,接近 10%的畢業生認為沒有任何幫助。這 些數據表明,大多數畢業生即沒有職業計劃,也不了解就業前景,對自己的職業 未來大多處于被動式的接受。調查還發現,50%的畢業生希望在高校,科研單位 工作,25%的畢業生希望在國有企業工作,18.8%的畢業生希望在行政機關工作, 只有 6.3%的畢業生更喜歡外資企業或私營企業工作,近 80%的畢業生希望畢業時 的起薪是每月3000-4000 元。數據可以看出畢業生就業期望高度集中,然而,考慮 到企業在實際的崗位供給,可能近 50%的畢業生不能實現他們的就業期望。
    面試準備的建議以及如何制作完美的簡歷并不足以讓每個學生走上他們想要 的職業道路。英國大學的研究表明,大約三分之一的畢業生最終與離開大學后找 到的工作不匹配。這些不匹配的畢業生面臨的前景較差,收入低于同齡人,他們 的職業生涯基本沒有用到他們通過三到四年的學習所獲得的知識和技能。這也說 明了傳統的職業建議不起作用。
    這樣的不匹配是否因為學生參加了錯誤的課程?答案是否定的。根據UUK的 研究,幾乎沒有證據表明畢業生正在研究錯誤的科目,因為大多數科目都提供了 非常必備的學科知識和就業技能。學生所需要的是更好的職業建議,來幫助他們 定義自己的技能和屬性,并了解這些建議如何匹配不同的職業選擇。學生還需要 更多的建議幫助他們了解,進入某些行業與此對應的需要提高哪些技能。特別是 在那些研究方向較專一的專業,在沒有親戚朋友從事相關行業或社交網絡也無法 提供可靠的建議時,更加需要一個可靠的職業推薦。
    那么作為大學,如何才幫助畢業生,給他們提供相關建議呢?為了幫助畢業 生找到合適的工作,許多大學正在嘗試新的方法,使他們的職業建議更容易和有 意義。在肯特大學,學生可以使用在線職業探索者服務,將他們的技能與職業選 擇相匹配,并提供工作學習計劃,為工作經驗提供一個平臺。鄧迪大學的學生可 以在其學術工作的同時學習就業能力模塊,包括在線和個人職業規劃課程。同時, 瑪麗女王的 QConsult 計劃將學生轉變為倫敦小企業和慈善機構迷用戶咨詢項目的 顧問。在諾威治藝術大學,他們正在為學生的職業生涯提供支持。他們開發了一 款名為 Profile 的職業紙牌游戲,為學生提供一副牌,其中一半描述技能和屬性, 另一半描述需要不同策略來解決它們的工作場景。要求學生將技能卡與場景相匹 配,并考慮如何適用于他們,以及克服實際問題的最佳方法。這樣能讓學生們意 識到他們已經掌握的技能,以及他們在工作場所需要的技能。由于 Profile 穿著游 戲的衣服,無論背景如何,它都是一個公平競爭環境。同時,這是一項安全、受 規則約束的活動,允許進行一種充滿困難的自我評估。借助政府資助支持技能開 發,他們的下一步是將個人資料轉變為虛擬現實體驗,為學生提供與工作場所的 VR 聯系,而真正的訪問受到成本、地理位置或工作經驗放置競爭的限制。這是一 個關于高等教育中畢業生就業能力和物有所值的政策辯論:大學如何支持他們的 學生走向正確的職業生涯?什么樣的成功才能算是大學的成功?
    1.2現有技術的發展現狀
    由于本文涉及概念較多一我們使用到了 MySQL、Java web、神經網絡、傳統 機器學習模型,以及推薦系統的各種算法,我們將在本章著重介紹神經網絡和推 薦系統的發展現狀,隨后在第2章介紹MySQL和Java Web,在第3章給出我們的 信息管理系統設計,并在第4章詳細介紹更具體的模型。
    1.2.1人工神經網絡發展現狀
    人工神經網絡(ANN)或連接系統是由構成動物大腦的生物神經網絡啟發得 到的計算系統[6]。神經網絡不是算法而是機器學習算法的框架,它們協同工作并處 理復雜的數據輸入。這些系統通過分析樣本來學習執行任務,不需要使用任何特 定任務規則。例如,在圖像識別中,神經網絡可以識別有貓的圖片——通過學習 那些已經別標記為“貓”和“沒有貓”的圖像,來識別其他圖片中的貓。整個過 程沒有任何關于貓的先驗知識,例如,他們有毛皮,尾巴,胡須和貓狀面孔。相 反,神經網絡會自動從學習資料中找到它需要的特征。
    人工神經網絡是基于稱為人工神經元的連接單元或節點的集合,這種結構可 以松散地模擬生物大腦中的神經元。我們都知道,生物的神經元會有信號傳遞, 一個神經元會傳遞信號給另一個神經元,收到信號的神經元還會發通知給其他的 神經元。人工神經元之間的連接處的信號通常是實數,并且每個人工神經元的輸 出通過其輸入之和的一些非線性函數來計算。人工神經元之間的連接叫做邊。神 經元和邊具有隨著學習而更新的權重。權值可以增加或減少連接處信號的強度。 人工神經元可以有閾值,從而使得僅在聚合信號超過該閾值時才發送信號。人工 神經元可以聚集成層。不同的層可以對其輸入執行不同類型的轉換。信號可能在 多次遍歷各層之后從第一層(輸入層)傳播到最后一層(輸出層)。
    一開始,科學家和研究者們是想要讓人工神經網絡能夠模擬人多大腦來解決 很多復雜的問題。但是漸漸地,他們將注意力轉移到執行特定任務,導致偏離生 物學。人工神經網絡現在已經可以完成很多復雜的任務,并且應用于多個領域。 比如人臉識別、語音識別、機器翻譯、醫學圖像識別等等。
    由于人工神經網絡具有復制和模擬非線性過程的能力,因此在各種學科中都 有許多應用。應用領域包括系統識別和控制,量子化學,游戲和決策,模式識別, 序列識別,醫療診斷,金融,數據挖掘,可視化,機器翻譯,社交網絡過濾和電 子郵件垃圾郵件過濾。
    人工神經網絡已被用于診斷癌癥[7],包括肺癌,前列腺癌,結腸直腸癌,并僅 使用細胞形狀信息將高侵襲性癌細胞系與侵入性較小的細胞系區分開來。
    人工神經網絡已被用于加速受自然災害影響的基礎設施的可靠性分析[8,9]。
    人工神經網絡也被用于建立地球科學中的黑箱模型:水文學[10,11],海洋模擬 和沿海工程[11,12],和地貌學[13]。
    1.2.2推薦系統發展現狀
    作為高等學校,科學、高效地管理大學生信息是十分重要的。一個全面、高 效、功能強大的信息管理系統可以極大地幫助教學工作的開展,同時能代替傳統 的文檔管理模型。同時隨著就業形勢的不斷變化,國家經濟轉型和國內產業結構 調整,新興企業的需求量不斷上升,傳統企業的需求固話,對學生就業分析的預 測系統在高校就業工作中開始嶄露頭角,同時隨著國外神經網絡技術的飛速發展, 大數據和云計算的價值和作用開始體現出來。
    推薦系統根據使用的推薦方法可以分為基于協同過濾的推薦(Collaborative filtering),和基于內容的推薦(Content-based filtering)<,
    協同過濾的概念最初由提出 Goldberg 等人在[1]中提出。這一方法隨后被 Resnick 等人在 [2] 中推廣。協同過濾的核心思想是,喜歡相同物品的用戶被認為 有相似的喜好,因此將相似用戶喜好的其他物品推薦給對方(基于用戶的協同過 濾)。同樣地,被相同用戶購買的物品可以視為相似物品,再根據用戶喜好,將相 似物品推薦給用戶(基于物品的協同過濾)。除了上述兩種方式,還可以根據用戶 的歷史喜好訓練模型,同時結合用戶實時喜好進行預測,根據預測結果進行推薦 (基于模型的協同過濾)。
    基于內容的推薦是目前使用最廣的推薦方法之一。它的基本思想是,根據物 品的屬性特征來尋找物品相似度,再由要用戶歷史偏好進行相似物品的推薦。內 容推薦的核心是對用戶喜好進行建模。其中,用戶的喜好從用戶和物品的交互信 息中推斷出。這里的物品一般多為文字類,比如郵件和網頁。交互信息通常從一 些用戶操作獲取,比如下載、購買、授權或者打標簽。
    協同過濾和基于內容的推薦方法都有各自的優缺點。協同過濾相比基于內容 的推薦,只需要提取少量特征——用戶對物品的顯性打分和隱性打分。在活躍用 戶多的情況下,協同過濾的推薦系統表現優異。但它的缺點也很明顯:推薦效果 十分依賴用戶偏好數據的多少。普通的中小企業缺少大量用戶偏好數據,因而無 法獲得較好的推薦效果。此外,協同過濾對物品和用戶都存在冷啟動問題。新加 入的物品缺少用戶打分,而新注冊的用戶沒有對任何物品進行打分,僅依靠協同 過濾的方法無法對新物品和新用戶進行推薦。另外,用戶對物品的打分矩陣通常 是一個非常大的稀疏矩陣,導致矩陣計算時間花費巨大,很難為用戶提供實時推 薦。同時,協同過濾本身的算法優先推薦有大量用戶打分的熱門商品,因此它的 推薦缺少多樣性和長尾效應[3]。一個好的推薦系統的推薦列表應該具有多樣性, 這樣商家可以在推薦熱門商品的同時,也將一部分非熱門商品推薦給用戶,以此 獲得更多利潤。
    基于內容的推薦則更多地考慮到了商品屬性和用戶屬性,它能更好地對用戶 偏好建模,提供更精確的推薦。同時,因為使用了商品和用戶的特征,對新物品 和用戶也可以進行準確地推薦。但該方法對物品和用戶特征選取要求較高,其推 薦的效果很大程度上由模型好壞決定。此外,基于內容的推薦在尋找相似物品時 計算量較大,其搜索時間通常是0(九2)。
    在實際的應用中,人們更多地選擇混合型推薦方法。這類方法既結合了用戶 對物品的歷史偏好,同時加入了用戶特征量和商品特征量,有效地解決了冷啟動 問題,并且減少了相似匹配的計算量。但這類方法會比上述方法更為復雜,實現 的成本更高[4]。美國在線影片租賃商Netflix就使用了混合推薦系統,它通過協同 過濾比較相似用戶的偏好,再利用基于內容的方法,根據電影的特征,推薦與用 戶偏好電影的相似電影。
    1.3 本文的研究意義
    通過這個系統的開發和應用,可以為畢業生和企業提供更方便高效的服務; 能夠幫助畢業生打破社會經驗淺導致的壁壘,更容易找到適合自己的工作,實現 人生的價值和職業抱負;同時也能幫助企業找到更多契合需求的工作者,發展壯 大自身,提供更多的就業崗位,全面掌握求職人員信息與企業用人信息,切合實 際的提供人員配置,從而達到人員的供需平衡,提高人員工作匹配準確性,提高 工作效率,并使人力資源管理分析工作更具體。可以提高人力資源工作的有效性, 并在一定程度上解決社會就業問題。
    第二章 需求分析與項目基礎
    分析高校畢業生對于信息管理及就業預測系統的實際需求,將用戶需求總結 歸納梳理,然后建立需求分析模型。
    2.1用戶實際需求描述
    大學生信息管理系及就業預測系統,其總體開發目標是為大學生就業提供切 實可靠的指導參考,實現縮小學生與企業之間的信息差,我們通過廣泛的走訪調 研與網絡問卷,開展需求討論會等形式,獲取了各種類型用戶的需求資料,并將 用戶的需求總結歸納,其主要需求包括如下幾個方面:
    1.工作與專業相關度
    2017屆大學畢業生的第一份工作與學位所修專業相關匹配度為66%,和2016 屆基本持平。其中,本科和高職高專院校 2017屆畢業生的第一份工作與學位所修 專業相關匹配度分別為71%、 62%,均與 2016 屆的近兩年第一份工作與學位所修 專業相關匹配度(分別為70%、 62%)基本一致。在本科院校中,“雙一流”院校 2017屆畢業生的第一份工作與學位所修專業相關匹配度為 73%,非“雙一流”本 科院校2017 屆畢業生的第一份工作與學位所修專業相關匹配度為70%。綜上,有 將近40%的是畢業生選擇了與自己所學專業無關的工作,根據調查, 2017屆本科 畢業生選擇與專業無關工作的主要原因是“專業工作不符合自己的職業期待” (36%),其次是“迫于現實先就業再擇業”(22%),這樣的現象使得很多人學無 用武之地,大大浪費了社會的教育資源,進入就業崗位后需要從0基礎學期,不 但增加了職工的貢獻成本,也大大增加了企業負擔,導致企業更青睞有相關經驗 的技術人才,造成就業級差,不利于正常人員流動的形成,增加社會負擔和企業 用工成本。
    2.期待職業吻合度
    2017屆大學本科畢業生的第一份工作與其職業期待的吻合度為 49%,與2016 屆期待職業吻合度變化不大,依舊處于低位。其中,本科和高職高專院校 2017屆 畢業生的第一份工作與其職業期待吻合度分別為52%、 46%,均與 2016屆變化不 大,平均甚至不足一半。在本科院校中,“雙一流”院校 2017 屆畢業生的第一份 工作與其職業期待的吻合度為48%,非“雙一流”本科院校 2017屆畢業生工作與 職業期待的吻合度為 53%,綜上,近三年來各級畢業生的第一份工作與其職業期 待的吻合度均低于 50%,且無好轉跡象,這大大影響了就業的穩定性,職工貢獻 與忠誠度,企業與個人都將花費更多的成本在跳槽和挖人上。
    3.真實可靠的薪資水平
    現在社會生活壓力不斷增大,買房,買車,結婚生子都是大多數畢業生在就 業 2-3 年的重要規劃,因此他們對職業的薪資水平都有較高期待,但是各種渠道的 信息真假難辨,其中不乏虛假夸大,甚至有詐騙傳銷,因此,與其專業對應行業, 或者是與其擇業目標行業的真實薪資水平,對大學生來說,至關重要。
    2.2用戶用例需求描述
    分析大學生信息管理及就業預測系統的使用者情況,將使用者抽象為若干類 型的參與者,同構歸納總結,構建每一類參與者的功能用例需求分析模型。運用 UML 用例圖,實現參與者用例需求建模。
    2.2.1用戶劃分
    大學生信息管理及就業預測系統需求分析過程,需要根據系統用戶情況,對 于每一類用戶都開展有針對性的需求調研與分析。運用 UML 用例分析圖對用戶 功能需求進行建模分析,需要首先將使用者劃分成為不同類型的用戶。每一個用 戶是對于某一類系統使用者的抽象。為了進行參與者劃分,需要首先分析大學生 信息管理及就業預測系統使用者情況。
    (1) 系統管理員
    將負責管理整個學生系統的工作人員抽象為管理員,負責管理和維護 信息系統的日常運作。
    ( 2 ) 學生 即在校進行過注冊的學生,主要對信息系統進行訪問。
    ( 3 ) 教職工
    學校的正式員教職工,主要對信息系統進行訪問、編輯,通常會進行 添加、刪除、上傳文件等操作。
    2.2.2用戶用例分析
    根據上一小節中的用戶劃分,創建了以下用例需求分析模型 系統管理員需求建模:負責對系統進行全面管理,功能用例需求有管理系統 中的組織信息、教師信息、學生信息、課程信息。
    組織管理:組織指的是第三方企業,在本系統需要支持第三方上傳招聘信息、 編輯招聘數據,同時還要管理已有的組織招聘信息。
    教師管理:系統需要管理學校的教師信息,包括個人信息和崗位信息。還要 為教師提供查詢、編輯的功能。
    學生管理:管理學生的個人信息、學院和專業信息、選課信息。提供學生信 息的添加、編輯、刪除功能。還要加入是否為畢業生的屬性,為后面的預測分析 提供便利。
    系統管理:對于不同用戶進行權限管理,保證不同類型用戶的權限符合這類 用戶的崗位職責。
    賬號管理:管理不同類型用戶的賬號、密碼,還要為用戶提供注冊、修改密 碼的功能。
    操作日志管理:系統日志是監控和處理異常的必要工具,因此要妥善保存系 統的日志,以便分析異常和制定策略。
    2.3 業務流程分析
    學校將學生信息輸入管理系統中, 推薦系統根據數據庫中學生信息和就業環 境信息對學生在當前就業形勢中進行推薦,將為其提供最有可能錄用的行業,最 恰當的公司以及最合適的薪資水平。以此引導應屆生更好的找到適合自己的行業 和屬于自己的事業,幫助求職者更好的認識社會現狀和就業環境,提高學校就業 率,同時也可以為公司找到最適合的人才,緩解用工緊張的形勢,提高企業效益 以及發展水平。
    2.4項目需求
    2.4.1總體需求
    1.應屆畢業生人數連年增長,屢創新高:
    如下圖所示,2016 年應屆畢業生 765 萬,創下當時畢業人數記錄,但是沒過 多久2017 年便達到了795 萬人次,增長的腳步到此并未減緩,2018年應屆畢業生 人數打到破天荒的820 萬,就業壓力前所未有。
     
     
    圖 3-1 2001~2008 年全國高校畢業生人數圖
    2.大量留學人員學成后選擇回國就業
    據中國留學回國就業藍皮書統計,截止2015 年底,我國的留學生就已經超過 了四百萬的留學生,每年增長率是 19.06%。而回國的人數累計超過兩百多萬,年 增長率為 22.46%。這個現象在 2016-2018 又有了新的進展,很多海歸高學歷人才 在國內就業薪資待遇偏低,就業面不斷收窄,海歸優勢日漸模糊,導致每年大量 海歸人才進入待業狀態。
    3.就業滿意度不斷下降
    2017屆大學畢業生的就業滿意度為67%,比2016屆(65%)高2個百分點。 其中,本科院校2017屆畢業生的就業滿意度為68%,比2016屆(66%)高 2個百 分點;高職高專院校2017屆畢業生的就業滿意度為65%,比2016屆(63%)高 2 個百分點。 2017 屆本科畢業生對就業現狀不滿意的主要原因是“收入低”(64%)、 “發展空間不夠”(54%)。
    4.連續多年就業形勢嚴峻造成往屆生大量增加: 連續多年嚴峻的就業形勢導致每年都有很多應屆畢業生待業在家,處于無業
    狀態,然后再未來2-3 三年內進入就業市場擇業,因此2018 年算是往屆生,實際 就業人數可達1200-1300 萬,長此以往,未來就業壓力會越來越嚴峻,形成惡性循 環;
    2016年畢業生半年后就業率
    91.85%
    91.80%
    91.75%
    > 91.70%
    參 91.65% 91.60% 91.55% 91.50%
    本科生 高職高專學院
    坐標軸標題
     
    圖 3-2 2016 年畢業生半年后就業率圖
    5.存在信息差:
    一個是應屆畢業生對社會現狀不了解,不能正確的定位自我,過高的薪水要 求,不清楚自己適合的行業,以及對未來職業發展的規劃不清晰,導致應屆生在 招聘中喪失諸多機會;同時,企業也對應屆生要求過高,企業制度以及文化封閉 導致外界難以了解真實現狀,以及對自身定位過高引起企業無法找到對口人才。
    6.國家經濟轉型: 跟隨政策發展,才能更加找到個人在未來的發展方向; 綜上,我們設計的學生信息管理系統既能夠對學生信息進行存儲管理,以便 以后進行大數據分析,同時推薦系統可以很好的給學生就業給予準確的指導方向, 消除企業和個人之間的信息差,提高就業率。
    2.4.2功能需求
    本系統從功能上可劃分為信息管理模塊和推薦引擎模塊。我們首先將用戶的 相關信息錄入到信息管理模塊中,而后經由一系列數據清洗,將清洗后的數據作 為推薦模塊的輸入,對用戶進行個性化就業推薦。接下來我們對這兩大模塊進行 功能需求的分析。
    2.4.2.1信息管理模塊
    用戶登錄
    輸入用戶名和密碼,驗證后登錄系統。
    用戶注冊
    用戶輸入新的用戶名和密碼注冊并登陸到系統中
    編輯個人信息
    用戶可以添加自己的照片、QQ號、手機號碼等信息,并且顯示在用戶的個人 主頁。
    更改密碼
    用戶可以方便地修改密碼。
    信息查詢
    根據用戶的權限,為用戶提供相應的可查詢選項。學生用戶的可查詢包括成 績查詢、選課查詢、考試時間,已選課程的學生名單。教師用戶的查詢包括班級 學生個人信息、學生成績、任教課程信息等。管理員可以查詢所有信息。
    成績管理 管理員和教師用戶可以錄入學生成績,并且能夠添加、修改和刪除學生的成 績記錄,同時為不同用戶提供相應權限下的查詢功能。
    課程管理
    教師用戶給和管理員可以對課程進行添加、修改和刪除操作,同時為不同用 戶提供相應權限下的查詢功能。
    考試管理 考試信息由管理員預添加,然后再有教師添加學生成績。
    2.4.2.2個性化推薦模塊
    數據清洗及特征工程
    周期性地對所需信息系統中的數據進行數據清洗和特征工程,為個性化推薦 模塊提供所需的數據源。
    個性化推薦
    周期性地對系統內的目標用戶進行職位推薦。推薦模塊默認為所有用戶進行 個性化職位推薦,但是也可以根據需求對用戶進行過濾。例如僅對即將畢業的學 生展示個性化職業推薦。
    任務調度
    定時執行推薦模塊的運算模塊,同時前端部分定時查詢最新推薦模塊的輸出 數據。如果推薦模塊任務調度失敗,前端將展示一個預設的推薦結果作為兜底數 據。
    2.5系統開發相關技術
    2.5.1MySQL
    MySQL是一個關系數據庫管理系統(RDBMS)。其中,RDBMS表示R - DB- MS。DB代表Database,它是信息存儲的存儲庫。數據庫中的數據被組織成表, 每個表被組織成行和列。表中的每一行稱為記錄。記錄可能包含多個(稱為字段) 信息,表中的每個列稱為字段。 MS 代表管理系統,該軟件允許用戶插入,檢索, 修改或刪除記錄。R代表Relational,表示一種特殊類型的DBMS,它擅長將存儲 在一個表中的信息與存儲在另一個表中的信息相關聯,方法是查找每個表中共有 的元素。關系DBMS具有高效存儲和數據檢索機制的優點,并在RDBMS設計過 程中使用規范化過程。數據庫規范化過程超出了本文的范圍,可以使用多個參考。
    MySQL使用客戶端/服務器體系結構運行,其中服務器在包含數據庫的計算機 上運行,客戶端通過網絡連接到服務器。服務器操作系統通常是Linux (如Redhat 9.0 等)或 Windows 2000 操作系統。通常, Windows XP, Windows Server 2003, Red Hat Fedora Linux和Debian Linux等都支持MySQL。與任何其他客戶端/服務 器應用程序一樣,MySQL是一個多用戶數據庫系統,多個用戶可以同時訪問數據 庫。MySQL服務器偵聽通過網絡傳入的客戶端請求,并根據這些請求訪問數據庫 內容并,將其提供給客戶端。客戶端是連接到數據庫服務器并以預先指定的格式 發出查詢的程序。MySQL與基于標準的SQL(SQL代表結構化查詢語言)語言 兼容。客戶端程序可以使用編程的方式聯系服務器(或手動聯系服務器。例如, 當用戶通過telnet會話向MySQL服務器發出命令時,用戶將通過在命令提示符下 手動鍵入命令向服務器發出請求。另一方面,如果在表單中輸入了一些數據(比 如在互聯網上購買某些商品的信用卡信息),并且使用服務器端程序處理表單,則 會以編程方式聯系MySQL服務器。信用卡審批、會員訂閱等通常都是這種情況。
    MySQL具有以下特點
    1.速度:服務器端程序運行的速度主要取決于服務器硬件。鑒于服務器硬件 是最佳的,MySQL運行速度非常快。它支持要求苛刻的應用程序的群集服
    2.易用性:MySQL是一個高性能,相對簡單的數據庫系統。從一開始,MySQL 就通常從命令行進行配置、監控和管理。但也有幾個MySQL圖形界面可用:
    MySQL管理員:該工具使管理員可以設置,評估和調整他們的MySQL數據 庫服務器。這是為了取代 mysqladmin。
    MySQL Query Browser:為數據庫開發人員和操作員提供圖形數據庫操作界面。 它對于在單個用戶界面中查看多個查詢計劃和結果集特別有用。
    配置向導:管理員可以從預定義的最佳設置列表中進行選擇,也可以創建自 己的設置。
    MySQL 系統托盤:為基于 Windows 的管理員提供其 MySQL 實例的單一視圖, 包括啟動和停止其數據庫服務器的能力。
    3.成本:MySQL是免費的,并且是一個開源數據庫。MySQL是LAMP (Linux, Apache, MySQL, PHP / Perl / Python)environment 的一部分,這是一個快速增長 的開源企業軟件這是一個快速增長的開源企業軟件棧。越來越多的公司使用LAMP 代替昂貴的專有軟件堆棧,因為它具有較低的成本,同時有很好的可靠性和完善 的文檔。
    4.Query語言支持:MySQL理解基于標準的SQL (結構化查詢語言)。
    5.支持多個客戶多同時接入服務器,同時單個客戶端還可以同時訪問多個數據 庫。
    6.用戶可以通過聯網來訪問數據庫,更可以與其他人共享數據。用戶可以使用 ODBC驅動程序通過Windows程序實現連接。通過使用ODBC連接器到MySQL, 任何支持ODBC的客戶端應用程序(例如,Microsoft Office,報表編寫器,Visual Basic)都可以連接到MySQL。
    7.兼容性/可移植性:MySQL可以在多種UNIX上運行,也可以運行在其他 非UNIX系統上,例如Windows和OS/2。MySQL從家用PC到高端服務器的硬 件,都可以運行。此外,MySQL可以安裝在Windows XP,Windows Server 2003, Red Hat Fedora Linux, Debian Linux 等。
    2.5.2Java
    Java是自編程領域誕生以來最流行的編程語言之一。這種編程語言的使用超 越了信使。使用Java編程對于網絡銀行和金融科技應用來說非常普遍。與其他編 程語言相比, Java 在功能和安全環境方面絕對脫穎而出。 [22] 的報告中表明, Java 在所有網站和許多熱門網站中的使用率不到0.1%,這些網站命名為Udemy.com, Gcalc.net,Dukascopy.com等。根據Oracle的說法,它是許多企業系統中使用最多 的運行時平臺,其中包括97%的桌面。此外,超過30億臺設備以某種形式運行Java。 許多Web開發公司將Java用于其某些功能,Java服務器應用程序每天處理數千萬 個請求。近年來,Java Web應用程序已成為明顯的業務需求。這是因為Java的新 版本不斷增強Web應用程序開發的可能性。隨著對Web應用程序開發的需求增加, 企業正在尋求雇用 Java 開發公司。
    1.可擴展性
    Java編程語言可輕松擴展以用于Web應用程序開發。這是因為組件廣泛可用。 如果用戶計劃橫向或縱向擴展 Web 應用程序,該語言將適應用戶的需求,尤其是 在商業邏輯和永久存儲級別。
    2.跨平臺
    使用Java編程,用戶必須編寫一次,然后在任何地方使用代碼。它是Java最 重要的特性,也稱為可移植性。Java是跨平臺的,因為已編譯的Java程序可以在 具有Java虛擬機(JVM)的所有平臺上運行。業務中的實際場景是:首先,業務 所有者聯系Java開發人員來開發程序。開發Web應用程序后,可以在任何設備和 任何操作系統中使用。它可以是用戶自己的自主機器,可以疊加在任何操作系統 和任何硬件上。因此,企業主不再需要擔心更改硬件或操作系統,然后面臨糾正 現有軟件不兼容性的麻煩和成本。與基于Windows的平臺的編程語言相比,這是 Java 編程的一大優勢。
    3.內存管理
    在Java編程中,所有Java對象都是活的,它們被稱為“堆”在Web應用程 序啟動時會創建堆,并且可以在執行時增加或減少堆。如果堆填滿,則收集并消 除 垃圾,刪除不再使用的對象,使得新對象有空間可以進入。
    4.多線程
    JavaWeb 應用程序可以同時管理多個用戶的使用。可以通過為程序本內的每 個用戶創建線程來完成,而不必在同一硬件上執行編程的多個副本。在此過程中, 將跟蹤每個線程,直到作業結束。
    以下是多線程的一些優點:
    更少的故障:多線程服務器將始終保持響應,無論特定進程運行多長時間都 可以工作,而單線程服務器可能會停止響應并阻止其操作。
    快速響應時間:即使應用程序被大量人員同時使用,用戶命令也會在幾秒鐘 內完成。
    多個操作:可以同時執行許多操作,并且用戶的 Web 應用程序在執行此步驟 之前不會有太長的響應時間。
    更好的性能:由于JAVA具有緩存存儲和CPU資源的最佳使用,應用程序的 性能會更好。用戶的網絡應用程序將保持穩定并且無故障。
    維護成本低:各種經濟資源的使用使得它的維護成本很低。
    5.預算友好
    Java 是一種預算友好的語言,受到普遍歡迎。但是,對于許多企業而言,為 預算證明項目尋找可靠的Java開發公司也許很困難。
    2.5.3Python
    Python 是一種動態高級編程語言,設計它的宗旨是讓代碼更容易閱讀,而設 計者使用縮進的機制來實現這一點。Python的動態類型的機制讓程序員在編程的 時候不需要聲明類型,十分地靈活。此外,python還會自動管理內存,也就是說, 程序員不需要再擔心因為沒有釋放內存而導致內存溢出了,而且根本不需要主動 進行垃圾回收,省去了很多麻煩。Python解釋器還可用于許多操作系統。
    Python語言的多樣化應用是功能組合的結果,這些功能使這種語言優于其他 語言。Python編程的一些優勢包括:
    1.語法簡單
    Python的語法簡單,非程序員也可以快速上手。
    2.可讀性強
    Python的語法清晰,讓人很容易理解程序代碼。Python被稱作可執行的偽代 碼,因為它的語法大多遵循程序員用來概括他們的想法的慣例,而沒其他編程語 言那么冗長。因此,Python可用于原型化和測試代碼。
    3.高級語言
    比起級語言,Python看起來更像一種可閱讀的人類語言,讓程序員可以更高 效、快速地進行編程。
    4.面對對象編程
    面向對象編程可以創建可重復使用的數據結構,減少需要重復執行的工作量。 編程語言通常定義具有命名空間的對象,如類或def,對象可以使用關鍵字編輯自 己,如this或self。大多數現代編程語言都是面向對象的,例如Java,C ++和C#, 或者支持 OOP 功能,例如 Perl 版本 5 及更高版本。此外,面向對象技術可用于幾 乎所有非平凡軟件的設計,并且幾乎可以用任何編程或腳本語言實現。例如,許 多Linux內核功能是對象,它們通過指針實現自己的行為和數據構造封裝,特別是 在 C 編程語言中指向函數的指針。
    5.免費
    Python是免費和開源的。Python Software Foundation分發預先制作的二進制 文件,這些二進制文件可以在所有主要操作系統CPython上免費使用。此外還可 以修改源代碼,并按照CPython許可證的允許進行分發。
    6.可跨平臺運行
    Python可在所有主要操作系統上運行,如Microsoft Windows, Linux和Mac OS X。
    7.支持廣泛
    Python擁有一個活躍的支持社區,其中包含許多網站,郵件列表和USENET netnews 組,這些組吸引了大量知識淵博且有用的貢獻。
    8.安全性強
    Python沒有像其他基于C語言的指針,因此更加可靠。除此之外,錯誤永遠 不會無聲地傳遞,除非它們被明確地沉默。這使用戶可以查看和讀取程序崩潰的 原因以及糾正錯誤的位置。
    9.有各種強大功能的內置庫
    Python有超過300個標準庫模塊,其中包含用于各種編程任務的模塊和類。 例如,標準庫包含能安全創建臨時文件的模塊,將文件映射到內存的模塊,產生 和控制子進程的模塊,壓縮和解壓縮文件和歸檔文件的模塊,訪問索引的DBM數 據庫文件的模塊, 連接各種圖形用戶界面的模塊,如 TK 工具包和流行的 WxWindows多平臺窗口系統,解析和維護CSV和“.cfg”或“.ini”配置文件的模 塊,用于發送電子郵件的模塊,獲取和解析網頁的模塊等。例如,可以使用不到 十幾行代碼在Python中創建自定義Web服務器,當然也可以使用其中一個標準庫。
    10.可擴展性強 除了標準庫之外,還有大量免費提供的附加模塊,庫,框架和工具包。很多大型 網站都采用了 python 來開發,比如亞馬遜、 Facebook 等。還有很多軟件也采用了 python作為腳本,比如理信息系統ArcGIS[14]。Python還是人工智能開發的主要 語言,現在幾乎所有的人工智能機器學習工具包是基于 python 的。甚至還有一些 操作系統, AmigaOS 4、 FreeBSD 等,將 python 作為標準組件。
     
     
    第三章 系統總體設計
    本節將介紹大學生信息管理及就業預測系統的總體架構,數據庫的架構和就業 推薦的工作流程。
    3.1系統總體架構
    前端網頁
    己選課程頁 n 學生信息頁 1 教師信息頁 if 就業推薦頁
     
    ML模塊
    特征提取
    傳統ML
    深度學習
     
    圖 3-1 整體架構圖
    我們的整個信息管理及就業推薦的系統架構如圖 3-1 所示,本架構由數據層、 基礎層、決策層以及前端網頁組成。其中,數據層用于收集學生數據(包括個人 信息、選課記錄、考試成績、求職簡歷等)、崗位數據(招聘公司信息、招聘職業 信息、招聘要求等),以及就業數據(歷年本校學生的就業數據),這幾類數據將 作為后面應用的重要的數據源。
    經過基礎層的數據建模,決策層利用多種模型對數據進行清洗、特征提取、 模型計算以及評估。同時,我們設計實現了評估模塊,該部分模塊由離線評估和 在線評估組成。離線評估計算推薦結果的準確率、召回率等評價指標。在線評估 就是A/B test,但是A/Btest通常需要進行埋點和分流,才能得到測試結果。由于 我們目前的系統更偏向學術用途,其目的是為工業落地提供一個原始技術模型, A/B test對我們現在的系統來說實現起來比較不現實,所以我們并且有實現這部分 功能。然而,作為系統架構設計,這一部分卻是十分重要的一環,因為在這里提 出。
    最終輸出的數據將直接讀取和展示在前端的網頁。
    3.2數據庫的架構
    數據庫擔負起了系統的信息存儲和信息收集功能,需要保證異常的時候,不 要丟失所有數據即可(丟失幾個或幾十個學生的信息屬于可接受范圍,可以后期 人工恢復)。對應的架構如下:
     
    圖 3-2 信息管理系統框架圖
     
    Nginx是一個輕量級的Web服務器,同類型的還有ApacheoNgnix相比Apache 要輕量級很多,而且并發性能力特別好,同時它還有負債均衡的優勢。在我們的 架構圖中,通過Nginx搭建Web服務器,再由服務器與Mysql數據庫交互。此外, 我們還需要搭建一個數據庫的主從備份,也就是保持多個數據庫的狀態同步,對 于某一個數據庫的操作都應該自動備份到其它的數據庫。這樣做的原因一是為了 在主數據庫遭到破壞時能有備份數據庫,二是在數據請求太多的時候,可以將請 求分攤到其它備用數據庫上面,提高效率。主從備份的實現思路是,主服務器每 次都將進行的操作寫入一個日志中(通常是二進制),從服務器則讀取這個日志, 并將日志中的操作執行一遍,這樣就實現了主從備份的操作。
    3.3數據流圖
    本系統采用自頂而下數據流設計:
     
    圖 3-3 數據流設計圖
     
    這里的前端指的是網頁端,我們的整個系統是以網頁的方式展示給用戶的。 數據庫存儲了所有的學生、教師、課程的數據和就業推薦信息,它可以直接與前 端進行交互。最右邊的推薦系統是一個后端計算模塊,主要是從數據庫提取數據 然后進行相應的機算,最終將計算后的結果存入數據庫中,同時返回給前端。
    3.4就業推薦工作流程
    就業推薦的的工作流程主要由五個部分組成:數據源、預處理、特征工程、 模型、推薦過濾。
     
    圖 3-4 推薦引擎流程圖
     
    在介紹推薦引擎的工作流程以前,我們先介紹機器學習的大概流程。我們使 用的機器學習方法包括了模型訓練和模型預測兩個階段。在模型訓練階段,我們 需要先從數據源中獲取模型所需要的數據,然后對數據進行清洗和提取特征,接 著把處理過的特征作為輸入,傳入模型中。模型獲得輸入以后,會經過多次迭代, 迭代期間會更新模型的參數來以獲得一組最佳的參數,把得到的這組最佳參數帶 入我們的模型,就得到了一個訓練以后的最優模型。而這整個迭代更新參數的過 程,稱之為模型訓練。在得到了一個訓練后的模型之后,就需要進行模型預測階 段。在預測階段,我們仍然需要先從數據源獲取所需的數據,然后同訓練階段時 一樣,進行數據清洗和特征工程,把得到的特征輸入到訓練好的模型中,模型會 對數據進行計算,得到結果。這樣就完成了整個模型訓練和預測。
    理解了上述過程以后,再回到開頭的工作流程,就比較容易理解我們的推薦引 擎的工作流程被分為了訓練部分和預測部分了。訓練流程是:數據源抽數->數據清 洗->特征工程->模型訓練->保存模型。預測流程是:數據源抽數->數據清洗->特征 工程->模型預測->推薦結果過濾->輸出結果到前端。
    第四章 信息管理模塊的設計與實現
    4.1引言
    信息管理模塊主要有兩大功能:
    1) 為學校提供日常的教學信息管理,例如成績管理,課程管理等。
    2) 通過教學信息的收集和企業信息的收集,作為后面介紹的推薦模塊的數據 源。
    我們采用Java編寫系統前端用戶界面,使用MySQL設計后端數據存儲系統。
    1.基本功能
    • 登錄
    • 注冊
    • 信息查詢
    • 成績管理
    • 課程管理
    • 就業推薦
    2.性能
    一般學校學生約 1~5 萬人,學生信息管理系統訪問頻率不高,平均每天單個 學生的訪問次數不到 1次,因此性能這部分要求并不復雜,存儲使用常規的 MySQL 數據庫既能勝任,緩存可以不用,Web服務器使用Nginx綽綽有余。
    3.可擴展性 學生信息管理系統功能比較穩定,可擴展空間并不大,因此可擴展性也不復
    雜。
    4.高可用
    學生信息管理系統即使宕機 2 小時,對學生管理工作影響并不大,因此可以 不用做負載均衡,更不用考慮異地多活這類復雜的方案。但是,如果學生的數據 全部丟失,修復是非常麻煩的,只能靠人工逐條修復,這個很難接受,因此需要 考慮存儲高可靠,這里就有點復雜了。我們需要考慮多種異常情況:機器故障、 機房故障等。針對機器故障,我們需要設計MySQL的同機房主備方案;針對機房 故障,我們需要設計MySQL的跨機房同步方案。
    5.成本
    由于系統很簡單,基本上幾臺服務器就能搞定,對于一所大學來說完全不是 問題,故無需關注太多。
    4.2前端頁面的設計
    系統基本模塊:
    (一) 登陸: 登錄界面主要設計能輸入用戶名、密碼以及驗證碼的功能,同時還有一個用戶 身份的選擇。如果是學生登錄,需要選擇相應的學生用戶身份,以此類推。這樣 可以方便我們很快地進行查詢匹配。
    登錄成功以后,則展示一個網站的主界面。這個界面主要可以分為右邊的歡迎 欄,和左邊的菜單欄。菜單欄顯示了用戶可操作的各功能,例如學生信息管理、 教師信息管理等。
    (二) 系統設置: 設置系統配置,賬號信息等。設置學校名稱、教師通知和學生通知等信息。 同時還可以禁止教師和學生登錄,這樣的功能可以方便管理員對系統進行維護。
    (三) 修改密碼: 需要設置一個修改界面,設有原密碼和兩次新密碼的輸入。并設有提交按鍵 和重置按鍵。
    (四) 學生管理 學生的信息管理功能主要由個人信息的添加、刪除和修改組成。下圖展示了 添加/修改學生Martin的個人信息的界面。如圖所示,用戶可以輸入學生的學號、 姓名、性別、電話、年級和班級等信息。
    (五) 教師管理: 教師的信息管理界面包括了個人信息的添加、刪除和修改。教師信息需要編 輯的信息應該包括輸入學號、姓名、性別等。
    (六) 考試管理 教師應該能夠管理考試名稱、考試時間、考試對象。
    (七) 成績管理 教師應該能夠上載在相應的考試科目后面上載學生的考試信息。
    (八) 信息查詢 除了上述的各種信息管理界面,我們還有設計了信息查詢界面。查詢的內容 包括學生信息、課程信息、成績信息等、第五章將要介紹的就業推薦模塊計算的 推薦就業職位。
    4.3數據庫設計
    431數據庫ER圖
    本小節將給出數據庫的ER圖。ER圖也叫實體-聯系圖,我們用它來表達數據 庫中實體的屬性以及實體間的關聯。這種圖接近人類思考的方式,簡單易懂,是 能讓非技術人員也能看懂的圖。 ER 圖由實體、屬性和關系三部分組成,其中用長 方形表示實體,橢圓形代表屬性,而菱形作為關系。這三者之間用邊相連。所謂 實體,就是數據模型中的對象,這里可以理解為我們數據庫中的表。屬性,顧名 思義就是實體具有的一些特性,通常實體包含至少一個屬性。關系代表了實體間 的聯系。
    1•用戶實體ER圖
    用戶實體圖很直觀地表現了,在我們設計的數據庫中,每個用戶都擁有用戶 名、密碼以及用戶類型這兩種屬性。其中類型可以試學生、教師或者管理員。
     
     
    2•學生實體ER圖
    學生ER圖包括了學生的ID、性別、年級、班級等屬性。
     
     
    家融址
    岀生日期
    學號
    入學時間
    性別
    年級
    所在院系
    圖 4-2 學生實體 ER 圖
    學生信息
    備注
    年級
    班主任
    專業
    圖 4-3 班級實體 ER 圖
    3.班級實體 E-R 圖
    班級ER圖包括了等年級ID和年級名稱。
    班級
    班級信息
    4.實體關系 E-R 圖
    下面的實體關系圖直觀地表示了各個實體間的關系。
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    姓名
    性別
    出生日期
    職稱
    «««
    管理員
    年JS
    姓名
    姓名
    .時安
    性別
    性別
    民族
    民族
    出生年月
    出生日期
    教書
    系別
    成境
    課程
    年級
    課程名
    學生
    老師
    圖 4-4 實體關系 ER 圖
    4.3.2 數據倉庫表設計
    為了便于信息系統的數據可以方便地被推薦模塊使用,我們推薦建立數據倉
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    庫,將數據進行建模,以便高效地維護和管理。數據庫的主要作用是存儲、管理 數據,存儲的數據內容和存儲形式則需要根據業務需求來設計。撰寫本文時,我 們暫時無法獲得學校內部數據源,本文使用到的數據均為外部數據,實驗數據有 限,因而實現時并沒有使用數據倉庫。這里我們仍然給出數據倉庫中 hive 表的設 計思路,將作為整個信息管理系統中不可或缺的部分,日后在項目真正落地時將 會用到該部分設計。通常,在數據倉庫中使用較多的表結構為拉鏈表、全量表和 增量表。拉鏈表始終記錄更新的數據,通過改變分區日期,讓最新分區里的數據 始終包含更新過的數據以及沒有更新過的數據。增量表是某日的增量數據,使用 該類表的方法是通過設置分區時間來有效地提取數據。全量表,顧名思義,包含 了以前的所有數據,使用該表的時設置分區為某一個日期,則提取的數據為該日 期及其以前的歷史數據。通過分析第 2 章所述的需求,并結合上述各種表結構的 特點,我們認為可以使用拉鏈表作為存儲和管理本系統的hive表結構。這是因為 拉鏈表不僅可以保存歷史數據,同時也更節省空間。假設我們使用全量表來統計 每天的數據,那么每天都需要新增一個完整的全量數據,在數據量大的情況下, 這樣做顯然十分浪費空間。如果使用拉鏈表,則不需要增加全量數據,只需增加 每天更新過的數據,這樣便達到了節省空間的目的。這樣選擇的前提是,數據量 大且每天改變的數據量較小,此時方能體現拉鏈表的優勢。而我們的系統剛好符 合這樣的業務需求,因此我們認為拉鏈表是不二選擇。在具體實現時,我們可以 通過增加 begin_date 和 end_date 兩個字段來實現鏈表的功能。其中, begin_date 表 示某條記錄的生命周期開始時間,設置end_date= '4712-12-31'表示某條記錄是 當前有效的。此外還可以額外加入dt字段,dt= '4712-12-31'也表示某條記錄為 有效。
    4.3.3數據字典
    本小節主要給出信息管理系統中的字段設計。我們的管理系統由用戶表、學 生表、教師表、課程表、年級表、班級表、年級-課程表、班級-課程-老師表、考 試表,以及考試成績表組成。下面給出的數據字典中,每張表都給出了當前數據 表所含的字段、數據類型、是否主鍵、是否為空,以及備注說明。在關系型數據 庫中,主鍵是用來唯一標識表中的一行,主鍵可以是一列或者多列的組合。外鍵 主要用來和其他表進行關聯,某張表的外鍵代表了它是另一張表的主鍵。
     
    表 4-1 系統用戶表
    系統用戶表(user)
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    account varchar(30) 否,不能重復,管 理員賬號,教師 工號,或學生學 號 賬號
    password varchar(30) 密碼
    name varchar(20) 用戶姓名
    type tinyint 用戶類型,默認 2(1 為管理員,2 為學生,3 為老 師)
     
     
    表 4-2 學生表
    學生表(student)
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    number varchar(20) 學號
    name varchar(20) 姓名
    sex varchar(4) 性別
    phone varchar(20) 電話
    qq varchar(20) QQ
    photo varchar(200) 照片路徑
    clazzid int 外鍵(班級 ID) 班級 ID
     
     
    表 4-3 教師表
    教師表(teacher)
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    number varchar(20) 工號
    name varchar(20) 姓名
    sex varchar(4) 性別
    phone varchar(20) 電話
    qq varchar(20) QQ
    photo varchar(200) 照片路徑
     
     
    表 4-4 課程表
    課程表(course)
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    name varchar(50) 課程名稱
     
     
    表 4-5 年級表
    年級(grade)
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    name varchar(50) 課程名稱
     
     
    表 4-6 班級表
    班級(clazz)
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    name varchar(50) 課程名稱
    gradeid int 外鍵(年級 ID) 年級 ID
     
     
    表 4-7 年級-課程表
    年級-課程(grade course)
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    gradeid int 外鍵(年級 ID) 年級 ID
    courseid int 外鍵(課程 ID) 課程 ID
     
     
    表 4-8 班級 -課程-老師表
    班級-課程-老師(clazz course teacher )
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    clazzid int 外鍵(clazz. id) 班級 ID
    courseid int 外鍵
    (grade course.cid) 課程 ID
    teacherid int 外鍵(teacher. id) 教師 ID
     
     
    表 4-9 考試表
    考試表(exam)
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    name varchar(50) 考試名稱
     
     
    time Date 考試時間
    remark varchar(200) 備注
    type tinyint(1) 考試類型,默認 1(1 為年級統 考,2 為平時考 試)
    gradeid int 外鍵(grade. id) 年級 ID
    clazzid int 外鍵(clazz. id) 班級 ID
     
     
    表 4-10 考試成績表
    考試成績表(escore)
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    examid int 外鍵(exam. id) 考試 ID
    studentid int 外鍵(student. id) 學生 ID
    clazzid int 外鍵(clazz. id) 班級 ID
    courseid int 外鍵
    (grade course.id) 課程 ID
    score int 默認0 成績
     
     
    表 4-11 職位表
    職位表(job)
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    name varchar 職位名稱
    description longtext 職位描述
    requirement longtext 職位要求
    location longtext 職位地點
     
     
    表 4-12 學生-推薦職位
    考試成績表(student job rec)
    字段名 類型 是否主鍵 是否為空 說明
    id int 主鍵值
    studentid int 外鍵(student. id) 學生 ID
    jobid int 外鍵(job. id) 職位 ID
    studentnumber varchar 外鍵
    (student.number) 學生學號
     
    4.3.4類對象設計
    本小節介紹系統中Java實現的類對象。設計如下Java類主要是為了使用Java
    對數據庫進行操作。為了實現Java對數據庫的操作,我們需要使用JDBC(Java Database Connectivity)類來進行Java數據庫連接并對數據庫進行操作。同時,我 們會用到DBUtils來簡化一些數據庫的操作,例如直接將結果變成我們需要的Java 數據類型,甚至直接寫sql語句進行數據庫操作等等。
    針對上一小節所設計的多張表,我們設計了七個類:用戶、學生、教師、年 級、班級、課程、成績,每個類都有它們對應表中的字段,并且其數據類型也設 計為對應的類型。
    表 4-13 系統用戶類
    系統用戶(user)
    字段 類型 注釋
    id int ID
    account String 賬號(學生和老師的學號即為賬號)
    password String 密碼
    type int 賬號類型(1為管理員,2為學生,3
    為老師)
     
     
    表 4-14 職位類
    職位(Job)
    字段 類型 注釋
    id int ID
    name String 職位名稱
    description String 職位描述
    requirement String 職位要求
    location String 職位地點
     
     
    表 4-15 學生類
    學生(Student)
    字段 類型 注釋
    id int ID
    number String 學號
    name String 姓名
    sex String 性別
    phone String 電話
    qq String QQ
    photo String 照片路徑
    clazz Clazz 學生所在班級
     
     
    表 4-16 老師類
    老師(Teacher)
    字段 類型 注釋
    id int ID
    number String 工號
    name String 姓名
    sex String 性別
    phone String 電話
    qq String QQ
    photo String 照片路徑
    courseList List<Course> 所選課程集合
     
     
    表 4-17 課程類
    課程(Course)
    字段 類型 注釋
    id int ID值
    name String 課程名稱
     
     
    表 4-18 年級類
    年級(Grade)
    字段 類型 注釋
    id int ID 值
    name String 年級名稱
    clazzList List<Clazz > 該年級下的班級
    courseList List<Course> 該年級的課程集合
    studentList List<Student> 該年級下的學生集合
     
     
    表 4-19 班級類
    班級(Clazz)
    字段 類型 注釋
    id int ID
    name String 班級名稱
    grade Grade 年級
    studentList List<Student> 班級的學生集合
     
     
    表 4-20 考試類
    考試(Exam)
    字段 類型 注釋
    id int ID
    name String 考試名稱
    time Date 考試時間
    remark String 備注
    grade Grade 年級
    clazz Clazz
    type int 考試類型,默認1(1為期中考試,2
    為期末考試)
     
     
    表 4-21 考試成績類
    考試成績(EScore)
    字段 類型 注釋
    id int 記錄的 id 值
    exam Exam 考試
    clazz Clazz 班級
    course Course 課程
    student Student 學生
    score int 該門課程的成績
     
    4.3.5后端實現
    我們的后端系統采用的是MVC(Model View Controller)的架構模式,它是目 前主流的軟件設計方法,這里簡單介紹一下它的思想。MVC包含三個部分,模型、 視圖和控制器。其中,控制器部分會轉發請求并處理請求,視圖部分負責圖形界 面的設計,模型部分主要用來實現算法以及數據庫的設計。 MVC 模式對應到 Java Web里,則是:View層由JSP、HTML編寫,(JSP是Java服務器頁面,這種文件 可以在HTML文件中插入Java程序,用來在服務器端執行,實現動態網頁。HTML 就是超文本標記語言,用來創建網頁的。)Controller層主要編寫的是接受View層 請求的 Servlet。 Servlet 是 Java 的一個類,用來處理請求和發送響應的,現在的動 態頁面都是基于Servlet技術實現。Model層主要需要編寫DAO層、Bean層以及 Service層。DAO (Data Access Object)層是指數據訪問層,用來對數據庫中的表 進行操作,例如對某個表進行刪除、添加、查找等。Bean層的主要功能是將指定 的 Bean 集合成一個包,以方便管理大量的 Bean。 Java 中的 Bean 其實是一種可以 復用的Java類,一般用它實現一些基本的功能。接下來,我們將對三個模塊的實 現進行詳細介紹。
    我們的View層實現主要是編寫JSP文件,實現網頁設計。前面說到了,JSP 主要的功能是HTML中嵌入JAVA代碼以實現動態頁面,以下是我們實現登錄界 面的核心代碼。
    <script type="text/javascript">
    $(function(){
    //點擊圖片切換驗證碼
    $("#vcodeImg").click(function(){ this.src="LoginServlet?method=GetVcode&t="+new Date().getTime();
    });
    //登錄
    $("#submitBtn").click(function(){
    if($("#radio-2").attr("checked") &&
    "${systemInfo.forbidStudent}" == 1){
    $.messager.alert("New Message", "Failed to login", "warning");
    return;
    }
    if($("#radio-3").attr("checked") &&
    "${systemInfo.forbidTeacher}" == 1){
    $.messager.alert("New Message", "Failed to login", "warning");
    return;
    }
    var data = $("#form").serialize();
    $.ajax({
    type: "post",
    url: "LoginServlet?method=Login",
    data: data,
    dataType: "text", //返回數據類型
    success: function (msg){
    if("vcodeError" == msg){
    $.messager.alert("New Message", "Code Error!",
     
    $("#vcodeImg") .click();//切換驗證碼
    $("input[name='vcode']") .val("");//清空驗證碼 輸入框
    } else if("loginError" == msg){
    $.messager.alert("New Message", "Account or Password error!", "warning");
    $("#vcodeImg") .click();//切換驗證碼
    $("input[name= 'vcode']") .val("");//清空驗證碼 輸入框
    } else if("admin" == msg){ window.location.href = "SystemServlet?method=toAdminView";
    } else if("student" == msg){ window.location.href = "SystemServlet?method=toStudentView";
    } else if("teacher" == msg){ window.location.href = "SystemServlet?method=toTeacherView";
    } }
    });
    });
    //設置復選框
    $(".skin-minimal input").iCheck({ radioClass: 'iradio-blue', increaseArea: '25%'
    });
    })
    接下來我們在Controller層實現Servlet類,來接受View層請求。我們定義并
    實現了以下幾個Servlet類。
    >| Jj ClazzServletjava
    >JT] CourseServlet.java
    >,Jj ExamServletjava
    >』GradeServletjava
    >,£] JobServlet.java
    >[J] LoginServlet.java
    >]T] PhotoServlet.java
    >{JJ ScoreServletjava
    >Stu dentServI et.java
    >jf] SystemServlet.java
    >JT] TeacherServletjava
    圖 4-5 Servlet 中定義的類
    以學生Servlet類StudentServlet為例,在這個類中,通過創建一個學生的service 類的對象作為屬性,可以直接調用服務層定義的功能,下面介紹service層會詳細 介紹。Servlet層主要還是對我們在view層定義的request作出響應實現的一些功能。 例如,以下是一個跳轉學生個人信息頁面的StudentServlet中的方法。
    /**
    *轉到個人信息頁,加載個人信息
    *@param request
    *@param response
    *@throws IOException
    *@throws ServletException
    */
    private void toPersonal(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    User user = (User) request.getSession().getAttribute("user");
    Student student = service.getStudent(user.getAccount()); request.getSession().setAttribute("userDetail", student);
    request.getRequestDispatcher("/WEB-INF/view/student/studentPe rsonal.jsp").forward(request, response);
    }
    Model 層包括 Bean 層、 DAO 層和 service 層。我們先介紹 Bean 層的實現。我 們在Bean層里實現數據模型類,這對應在我們的系統就是職位類Job、班級類Clazz、 課程類Course>學生類Student、教師類Teacher,以下是我們在Bean層中定義的 所有類的列表。
    >[J] Clazz.java
    >[J] Course.java
    >[T| Courseltem.java
    >國 EScore.java
    >[T] Exam.java
    >① Grade.java
    >Job.java
    >[T| Page.java
    >]Tj Student.java
    >[7] System I nfo.java
    >|7| Teacher.java
    >囚 Userjava
    圖 4-6 Bean 層中設計的類
    Bean里面的每個類都有對應的屬性和方法。以Student類為例,我們定義的 Student類的屬性有姓名、ID、學號、性別、電話、年級、班級等。Student的方法 有獲取和設置學生的班級號、ID、姓名、成績等。下圖是Student類的屬性以及部 分方法的代碼截選。
    public class Student {
    private int id;
    private String number;
    private String name;
    private String sex;
    private String phone;
    private String qq;
    private Clazz clazz;
    private int clazzid;
    private Grade grade;
    private int gradeid;
    private List<EScore> scoreList;
    private String[] course = new String[]{};
    public int get【d() { return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public String getNumber() {
    return number;
    }
    public void setNumber(String number) {
    this.number = number;
     
    接下來介紹 DAO 層的設計和實現。我們在 DAO 層聲明接口類,然后再同一
    層里實現這個接口類的類,接著再重寫接口里的方法,也就是對表格的操作方法
    下圖中左邊是我們定義的所有DAO接口類,右邊是我們的接口實現。
     
    圖 4-7 DAO 層設計的類和接口
    以學生接口舉例,下面的代碼實現了 Student類接口的。
    public class StudentDaoImpl extends BaseDaoImpl implements StudentDaoInter {
    public List<Student> getStudentList(String sql, List<Object> param) {
    //數據集合
    List<Student> list = new LinkedList<>();
    try {
    //獲取數據庫連接
    Connection conn = MysqlTool.getConnection();
    //預編譯
    PreparedStatement ps = conn.prepareStatement(sql);
    //設置參數
    if(param != null && param.size() > 0){ for(int i = 0;i < param.size();i++){ ps.setObject(i+1, param.get(i));
    }
    }
    //執行sq l語句
    ResultSet rs = ps.executeQuery();
    //獲取元數據
    ResultSetMetaData meta = rs.getMetaData(); //遍歷結果集
    while(rs.next()){
    //創建對象
    Student stu = new Student();
    //遍歷每個字段
    for(int i=1;i <= meta.getColumnCount();i++){ String field = meta.getColumnName(i); BeanUtils.setProperty(stu, field, rs.getObject(field));
    }
    //查詢班級
    Clazz clazz = (Clazz) getObject(Clazz.class, "SELECT
    *FROM clazz WHERE id=?", new Object[]{stu.getClazzid()});
    //查詢年級
    Grade grade = (Grade) getObject(Grade.class, "SELECT
    *FROM grade WHERE id=?", new Object[]{stu.getGradeid()});
    //添加
    stu.setClazz(clazz);
    stu.setGrade(grade);
    //添加到集合
    list.add(stu);
    }
    //關閉連接
    MysqlTool. closeConnection();
    MysqlTool.close(ps);
    MysqlTool.close(rs);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return list;
    }
    }
    MVC框架中的Model部分的最后一層是service層,其實就是對DAO層的一 次封裝,主要用來實現業務邏輯。我們的 service 層包含了以下幾個類,用來實現 每個類(實體)的更高級的復雜操作。這里依舊用Student類來舉例,我們先打開 如下列表。
    >JT] ClazzService.java
    >j Jj CourseService.java
    >]Tj ExamService.java
    >{lj GradeService.java
    >[T| JobService.java
    >[jj PhotoService.java
    >[T] ScoreService.java
    >[jj StudentService.java
    >{T| SystemService.java
    >JT] TeacherService.java
    圖 4-9 Service 層中設計的所有類
    然后找到service層對應的Student類定義為StudentService。通過在 StudentService 里直接設置 DAO 層的 StudentDaoInter 接口為私有屬性, 就能在 service類中調用DAO層里面實現的各種基礎操作,從而實現更高級的業務邏輯。 下面的代碼實現了在service層中對學生信息進行修改的操作。
    public class StudentService { private StudentDaoInter dao; public StudentService(){ dao = new StudentDaoImpl();
    }
    /**
    *修改學生信息
    *@param student
    */
    public void editStudent(Student student){
    String sql = "";
    List<Object> params = new LinkedList<>(); params.add(student.getName()); params.add(student.getSex()); params.add(student.getPhone()); params.add(student.getQq());
    if(student.getGrade() == null || student.getClazz() == null){ sql = "UPDATE student SET name=?, sex=?, phone=?, qq=?
    WHERE number=?";
    } else {
    sql = "UPDATE student SET name=?, sex=?, phone=?, qq=?, clazzid=?, gradeid=? WHERE number=?";
    params.add(student.getClazzid());
    params.add(student.getGradeid());
    } params.add(student.getNumber());
    //更新學生信息
    dao.update(sql, params);
    //修改系統用戶名
    dao.update("UPDATE user SET name=? WHERE account=?", new Object[]{student.getName(), student.getNumber()});
    }
    }
    第五章 就業推薦引擎的設計與實現
    5.1引言
    本章介紹整個信息推薦系統的推薦引擎。我們的職業推薦引擎總的來說有兩 大類數據,一類是學生的數據,比如學生的個人信息、專業信息以及學科成績等; 另一類是各企業的招聘信息。第一類學生數據我們可以直接從信息管理系統中獲 得,而對于另一類招聘信息我們有兩種方案來獲得。第一種方案是,我們為招聘 數據再創建幾張表,設計的邏輯和方法與第三章中所述的信息系統是一樣的,然 后開發一個 web 端,放在學校的服務器上,并利用運營的手段鼓勵各企業將其招 聘信息錄入到系統中,這樣我們就能收集到第三方招聘數據了。第二種方案是, 找一家大規模招聘網站,讓他們為我們提供接口,從而直接讀取招聘網站的招聘 數據。
    下面我們對兩種方案的可行性稍作分析。對于第一種方案,考慮到每年會有 諸多企業來到高校進行校園招聘,鼓勵他們將招聘信息提前錄入到設計好的系統 中是完全可行的,理由有兩點:首先這樣做對他們沒有任何風險,同時又能為他 們的照片提供精準篩選,實則為一個雙贏的方案。需要說明的是,我們的推薦引 擎雖然直接目標是大學生,但是我們的推薦結果稍作處理就能為企業推薦合適的 候選人。第二種方案需要和招聘網站進行合作,希望他們能提供招聘數據的接口, 同時,可以將我們的推薦模塊接口提供給招聘網站,為他們提供推薦引擎的運算 功能。這其實就相當于我們成為了一個平臺,把我們的模型接口提供給別人。總 的來說,我們認為這兩種方案都具有一定的可行性,其中方案一的可行性更大一 些,因為涉及的風險更小。
    如上所述,我們的推薦引擎的一部分數據源來自于學生信息管理系統,另一 部分數據源來自企業。這就使得大學生的職業推薦需要依賴于信息管理系統,因 為推薦引所需的數據是直接從已搭建好的信息管理系統中提取的。這樣一定程度 節省了開發成本,也更便于維護。如果沒有信息管理系統的建立,就無法收集到 推薦系統所需要的數據,也就無法進行個性化推薦了。同時,推薦系統擴展了信 息管理系統的功能,為信息管理系統中的數據進行數據挖掘,提供精準推薦,使 得整個信息管理系統具有更高效、更強大的功能,真正達到科學、高效、準確地 人事管理和信息管理。
    對于獲得招聘數據的問題,從上面所提出的兩種方案中我們能看出,兩種方 案涉及的實現方法都是不一樣的,而我們工作的核心是展示這種信息管理系統和
    推薦引擎相結合的模式,因此我們選擇對上述獲取招聘數據的方案不作實現。
    5.2數據預處理
    在 3.4 節中,我們介紹了本推薦引擎的工作流程。首先從第四章我們介紹并搭 建的數據庫中進行抽數,然后我們就需要對抽取出來的數據進行預處理。數據預 處理主要包含兩個步驟——數據清洗和特征工程。在訓練模型之前,我們首先要 對用戶和招聘職位的數據進行清洗和特征選擇,然后才能將這兩個預處理過的特 征用于后面的推薦模型的訓練和測試。本小節將詳細介紹數據預處理。我們將首 先介紹預處理的重要性,然后給出預處理的步驟,再分別對預處理中的兩個主要 部分——數據清洗和特征工程,進行詳細的介紹。
    5.2.1預處理的重要性
    在機器學習的工作流程中,數據預處理是不可缺少的重要環節。這是因為機 器學習對數據非常依賴,而數據質量的好壞直接決定了機器學習模型的最終預測 表現。所以預處理的主要目的是,確保用來訓練機器學習模型的數據要足夠好。 所謂足夠好,一是要適合我們所選擇的模型,二是要盡可能少的包含噪聲數據。 下面介紹預處理的基本步驟。
    5.2.2預處理步驟
    1.數據清洗
    a)提取有用的數據 從數據庫或者系統日志中取得的數據,很可能有很多非正規的格式。 比如職位的描述,這些文字很可能是從網頁文件中提取的,通常會含 有各種Tag,像是<p> Software Developer </p>這樣的,文字會嵌套 在Tag里面。因此我們需要使用一些工具來去除這些Tag,得到干凈 的文字。
    b)填補缺省值 無論是從數據庫中抽取的數據,或者使用現成的數據集,我們經常會 發現有些項的數據是沒有的。缺少數據的原因有多種,比如在收集用 戶信息時,有些用戶選擇不填某些項的數據,這些都是經常會遇到的 情況。那么一旦遇到缺失的數據,我們就需要處理它們。通常有兩種 方法,一是直接去掉這一組缺失的數據,比如某個用戶沒有填入姓名 和性別,那我們就直接把這個用戶的數據整個去掉不使用它。第二種 方法是,給缺失數據的項填入默認值,通常的做法是填入 0或者 1。
    2.特征工程
    a)類別數據處理 我們的數據中經常會有些表示類別的數據,比如“男”、“女”,或者“中 國”、“美國”。這樣的文字信息,機器是無法理解的,因此我們需要對 他們進行一定的轉換。我們通常稱這種轉換為編碼。
    b)連續數據處理 連續數據就是一些取值為實數的數據,比如年齡、身高、體重。雖然 機器可以直接“理解”這類數據,但是通常為了讓機器能更好地理解 他們,我們會將連續數據進行一些分類處理。我們在 4.2.3中進行了 詳細介紹。
    c)劃分訓練集和測試集 對于一個完整的數據集,我們需要將它分為兩個部分,一部分用來訓 練模型,稱為訓練集。另一部分用來測試模型的表現,稱為測試集。 拆分的規則是,要保證絕大部分的數據都用來訓練模型,少部分的數 據用來測試。通常的做法是,選取 80%的數據用來訓練,剩余的 20% 的數據用來測試。
    d)歸一化處理 我們需要將每種特征都進行歸一化處理,將這類數值通過數學函數, 映射到一個固定的區間,通常映射到[0,1]或[1,1]。這樣做的目的, 是為了避免,某一類特征由于具有的數值比較大,而其他類的特征數 值比較小,從而導致機器學習模型只專注于這類特征,而把其他數值 小的特征忽略了。
    5.2.3第三方數據來源
    由于我們的系統并沒有真正上線使用,所以無法收集我們系統產生的歷史用 戶行為數據以及職位數據。因此我們選擇其他現有的數據集進行設計和實驗,以 此證明我們設計的推薦系統是合理、高效、可行的。我們使用了[5]中的數據集, 它是一個發布在 Kaggle 上的關于職位推薦的競賽的數據集。這個數據集剛好符合 我們系統的要求:它包含了要用戶的個人數據、用戶的歷史職位申請數據,以及 招聘職位的數據。唯一遺憾的是,這個數據集缺少了用戶的學科成績這一項數據, 好在我們所使用的數據集中,用戶數據里包含了學歷和專業。我們認為,這兩項 數據一定程度能代替缺少的數據,達到類似的效果。
     
    在這個數據集中,用戶特征數據包括了所在地、教育程度、專業、管理經驗、 工作歷史等。職位特征包括職位名稱、崗位描述、要求、發布時間、結束時間等。 下面,我們針對該數據集,根據上面列出的步驟,對預處理中的兩大部分——數 據清洗和特征工程,分別進行詳細介紹。
    5.2.4數據清洗舉例
    •清理數據格式并提取可用數據
    我們的數據集中,需要進行清洗的主要是職位數據的職位描述Description和 職位要求Requirement。下圖是未經清洗的職位描述和職位要求。
    Description
    <p>Security Clearance Required:&nbsp: Top Secr...
    <strong>NO Corp, to Corp『esumes&nbsp:are bein...
    <b> <b> P/T HUMAN RESOURCES ASSISTANT</b> <...
    CITY BEV ERAGES Come to work for the best in th...
    I make sure every part of their day is magica...
    <b> <b>aon SALON.-'SPA COORDINATOR ...
    <b> <b>SUPERINTENDENT</b> </b> aZZaDZ Cen...
    <b> <b>ELECTRONIC PRE-PRESS PROFESSIONAL…
    <b> </b> Wn <b> <b>UTILITY LINE TRUCK...
     
     
    為了清洗這些文字,我們需要進行幾個步驟:
     
    1)去掉 HTML Tags
    2)所有單詞轉換為小寫
    3)句子分詞
    4)去掉標點和停止詞。
    5)詞形還原。
    我們使用了 NLTK包進行上述處理。NLTK的全名是Natural Language Toolkit, 它是一個用來處理自然語言的python包,也是現在主流的自然語言處理工具。
    以下是文字數據處理的核心代碼。
    def clean_text(self, rawtext):
    ii ii ii
    clean input raw text process steps: 1? remove HTML tags 2? tokenize words 3? remove punctuation 4? lowercase words 5? stem words
    extracted_text = self.parser.extract(rawtext)
    tokens = word_tokenize(extracted_text)
    lower_tokens = [word?lower() for word in tokens if word not in self?stop_words]
    stemmed_tokens = [self?stemmer?stem(word) for word in tokens] return stemmed_tokens
    處理完的職位描述如下圖所示,我們給出了其中三個清洗后的描述句子特征。 職位要求的文字處理也是類似的,這里就不再贅述了。
    description 1
    hr interview orlando web resume strong speaking year benef譏 question skill source experience os resource customer assistant sentinel servic e human fax description 2
    florida business route time career opportunity orlando beverage salary busch industrial distributor qualified competitive work delivery pers on benefit full best self advancement apply clean source drive license airport class product candidate sentinel eeo facility following dfwp premier city cdl motivated park posse crown come anheuser driver description 3
    turning visit housekeeping opportunity information recreation orlando beverage for magical life entertainment steward custodial look enchant ed show guest hotel apply take food realty dream beloved sure job every alike source part waltdisneyworld member cast pride class driver av ail able nowhiring drawing divers 譏 y many sentinel wait world there currently quick creativ 譏 y from that service disney bus make online perfo rmer today theme role park culinary lifeguard eoe day bring resort spectacular character find
    圖 5-3 清洗后的職位描述特征圖
    •填補缺失值
    填補缺失值的最好的方法是使用 Pandas。 Pandas 是一個 python 工具包,它自 己將數據以表格的形式存儲在它獨有的DataFrame數據結構中,從而得以高效地 處理數。這里,我們使用了 Pandas包中的填補缺失值的函數,對于每一列特征,
    它會自動填補缺失值為我們設定的值。我們這里設定填補缺失值為 0。 下面兩個圖是我們從樣本在選取的一個例子,以此來展示填補缺失值的前后 效果。第一張圖是沒有填補缺失值的樣本,我們可以看到, ID 為555的用戶的 TotalYearsExperience中有一個NaN,這就代表該用戶的這項數據沒有。
    UserID Tota I Yea r&Ex perien ce Man aged Others
    0 554 4.0 No
    1 555 NaN No
    2 589 26.0 Yes
    3 640 34.0 No
    4 644 4.0 No
    5 645 13.0 No
    圖 5-4 帶有缺失數據的用戶數據樣本圖
     
    下圖是我們對ID為555的用戶填補了缺失值以后的結果。可以看到,通過填 補缺失值為 0,該用戶的 TotalYearsExperience 的值從 NaN 變為了 0。
    UserID Total Yea rs Ex perien ce ManagedOthers
    0 554 4.0 No
    1 555 0.0 No
    2 589 26.0 Yes
    3 640 34.0 No
    4 644 4.0 No
    5 645 13.0 No
    圖 5-5 帶有缺失數據的用戶數據樣本圖
     
    5.2.5特征工程舉例
    經過5.2.4節中的數據清洗后,我們已經有了相對干凈的數據了。但正如我們 前文所說,僅僅是干凈的數據并不能讓我們的推薦模型學習到重要的、有意義的 信息。因此,我們需要一些方法來從干凈的數據中提取有意義的特征,這些方法 統稱為特征工程。
    在介紹具體方法前,我們簡要地介紹一下機器學習中的數據特征。
    顧名思義,數據特征是從數據中提取的,能代表其某一屬性的值。比如圖像 的特征就有圖像的邊、角、灰度值等,這些特征都很好地代表了圖像的某些特性, 并且我們可以使用這些特性來對不同的圖像進行區分,這也是為什么需要從樣本
    數據中首先獲取特征的主要原因。
    特征從類型上來分類,分為連續特征(Continuous Features)和類別特征 (Categorical Features)。連續特征的值均為連續的實數,比如在我們的用戶數據中, 工作年限和管理過的人數這兩種數據,它們的取值是無限的,因此我們可以把他 們作為連續特征。相對地,類別特征通常是一些有限的取值,例如用戶數據中的 專業、國家、州和城市,職位數據中的職位所在國家、州和城市,它們可取的值 都是有限的,所以我們將它們視為類別特征。
    下面我們分別介紹如何處理這兩類特征。
    • 類別型數據處理 處理類別型數據的初衷是讓機器充分理解某個特征表示的某一類別的東西, 而不是單純的數值。而類別型數據又可以簡單地分為兩大類:數值型和非數值型。 我們的數據集中,數值型類別特征有用戶ID、職位ID,非數值型類別特征有用戶 和職位所在的國家、州、城市,用戶的專業等。
    類別特征的轉換有兩步:1. 對該類別數據的所有取值編號;2. 對 1中的編號 進行獨熱編碼( one-hot encoding)。
    首先對每種類別值進行編號。我們拿用戶數據中的學歷水平(DegreeType)作 為例子來說明。首先,整個數據集中, DegreeType 數據的所有取值有六種: Associate's, Bachelor's, High School, Master's, PhD, Vocationalo 那么這六個值 對應了從 0到 5的整數編號。
    有了編號以后,我們進行one-hot encodingo one-hot encoding簡單來說就是用 一個比特表示一個狀態,而比特的總數等于該特征所有可能取到的值的個數。那 么我們的DegreeType數據經過one-hot encoding后,就成為了下面的數據。
    DegreeType DegreeTypeO DegreeTypel DegreeType_2 DegreeType_3 DegreeType_4 DegreeType_5
    0 Associate's 1.0 0.0 0.0 0.0 0.0 0.0
    1 Bachelor's 0.0 1.0 0.0 0.0 0.0 0.0
    2 High School 0.0 0.0 1.0 0.0 0.0 0.0
    3 Master's 0.0 0.0 0.0 1.0 0.0 0.0
    4 PhD 0.0 0.0 0.0 0.0 1.0 0.0
    5 Vocational 0.0 0.0 0.0 0.0 0.0 1.0
    圖 5-6 職位數的獨熱編碼結果圖
     
    進行one-hot coding的原因是為了避免因為由數值編號的類別特征帶來的額外 的信息。在我們的例子中,假如直接將第一步得到的編碼0到 5的整數作為特征 用來訓練模型,那么就會有"Associate's"小于"Bachelor's",”High School”小于 "Master's”這樣的關系。并且還會有"PhD”到"Master's”的距離小于"PhD" 到“Associate's”的距離。這樣的信息顯然不是我們想要的,因為學歷這個特征只 是為了說明樣本是屬于某一個類別。所以我們采用one-hot encoding來編碼,把一 個學歷類型的編號擴展成了六列的,當某一列為1而其他列為 0,就表示樣本屬于 為 1 的這一類代表的類別。
    • 連續數據處理 接下來介紹數值型類別特征。數值型類別特征大致分為兩種,一種是它的數 值代表的是某種編號,比如上文中的學歷類型這個例子,如果我們的數據一開始 不是學歷類型,而是給出的學歷類型的編號,這樣的特征我們也把它視為類別特 征。
    另一種數值型類別特征是通過轉換連續特征得到的。例如用戶數據中的工作 年限這個連續特征,我們可以對不同的年數進行劃分。這里劃分區間為 0至5 年, 5 年至 10 年,10 年至 15 年,則轉換后的特征如下圖。
    TotalYearsExperience (0,5] (5,10] (10,15]
    0 10.0 0.0 1.0 0.0
    1 8.0 0.0 1.0 0.0
    2 11.0 0.0 0.0 1.0
    3 3.0 1.0 0.0 0.0
    4 9.0 0.0 1.0 0.0
    圖 5-7 對連續特征分類后的特征編碼圖
     
    • 劃分訓練集和測試集
    我們將80%的數據作為訓練集,將 20%的數據作為測試集。
    推薦系統的模型將在訓練集中進行訓練。訓練好的模型會在測試集中進行預 測,將它得到的測試結果與測試集中已知的標準結果進行對比,通過計算我們規 定好的評測指標,來評測模型的效果。
    • 歸一化處理
    上面幾個步驟處理完的數據還不是最終用于訓練的數據,我們還需要進行歸 一化處理。簡單地說,就是把數值映射到一個比較小的區間,一般是映射到(0,1) 或者(1,1)。這樣做的原因主要有兩點。一是我們不希望不同特征會因為某一種特征 的取值范圍較大,導致這種特征對模型的影響大于了其他特征。第二個原因是, 歸一化以后的數據,會縮短模型的整個學習過程,這是因為機器學習的模型通常 會使用梯度下降(gradient descent)來進行參數更新,特征值的大小會影響梯度的 計算。
    • 特征降維
    我們在實際進行工程實現的時候,還需要對特征進行降維。特征降維的意思 很容易理解,就是降低特征維度。
    這里說一下為什么要降維。假設我們有十萬個招聘職位,有一百萬個用戶, 那么采用我們之前介紹的one-hot coding來編碼職位ID和用戶ID以后,就會分別 得到一個十萬維的職位 ID 向量,和一百萬維的用戶 ID 向量。最后再加上其它的 一些特征向量,得到的特征向量的總維數就有一百一十萬以上了。對于這樣的高 維數據,一般的計算機都沒有足夠的內存可以計算,因此需要對特征進行降維。 降維的方法有多種,我們選擇目前使用最多的 PCA(Principal ComponentAnalysis), 主成分分析,來進行降維。PCA可以將一系列相關聯的變量轉換成一系列無關聯 的變量,轉換后的維度遠小于原始的維度。PCA的步驟包括數據中心化、求出協 方差矩陣、對協方差矩陣求特征向量和特征值、取最大的 K 個特征值所對應的特 征向量、最后將樣本投影到特征向量上。我們在實現時,選擇使用 scikit-learn 包 中的TruncatedSVD函數,而不是PCA函數。TruncatedSVD函數使用了 SVD[24] 的降維方法,它的算法與PCA類似,但是可以高效地處理大量的樣本,非常適合 處理稀疏矩陣。以下是核心代碼。
    def fit(self, df, dim=100, dtype= 'numerical'):
    if dtype == 'numerical':
    self.onehot_enc = OneHotEncoder(handle_unknown='ignore')
    self?svd_enc = TruncatedSVD(
    n_components=100, n_iter=7, random_state=42)
    X = self?onehot_enc?fit_transform(
    df.values?ravel())? reshape(-1,1)
    self?onehot_enc?fit(X)
    else:
    self?label_enc = LabelEncoder()
    self?onehot_enc = OneHotEncoder(handle_unknown='ignore')
    self?svd_enc = TruncatedSVD(
    n_components=dim, n_iter=7, random_state=42)
    X_int = self?label_enc?fit_transform(
    df.values?ravel())? reshape(-1,1)
    X_onehot = self?onehot_enc?fit_transform(X_int)
    self?onehot_enc?fit(X)
    return self?label_enc, self?onehot_enc, self?svd_enc
    def transform(self, df, dtype='numerical'):
    ii ii ii
    dtype is numerical or string
    ii ii ii
    col = df?columns?tolist()[0]
    if dtype == 'numerical':
    t ry:
    X = self.onehot_enc?transform(
    df.values?ravel()? reshape(-1,1))
    except:
    df = df? replace({-999:0, -999?0:0?0})
    df = df[df[col]>=0]
    X = self?onehot_enc?transform(
    df.values?ravel()? reshape(-1,1))
    encoded_feat = self?svd_enc?fit_transform(X)
    else:
    X_int = self?label_enc.transform(
    df? values ? ravel())
    X_onhot = self?onehot_enc?transform(X_int ? reshape(-1,1)) encoded_feat = self?svd_enc?fit_transform(X_onhot) return encoded_feat
    •文字特征提取
    在我們的數據集中,涉及文字的特征有招聘職位Title、職位描述和職位要求。 接下里我們將這些文字特征轉化成在數值特征,這樣才能讓機器學習模型學習到 正確的信息。
    對于處理自然語言,目前主流的做法是將一個單詞轉換為一個向量,我們叫 word2vec,詞向量。它的基本原理是,通過機器學習模型將一個單詞映射成一個 固定長度的數值向量。關于word2vec的更多細節可以參考[23],本論文就不對此 展開了。Word2vec的實現有很多,最常用的是工具庫是gensim、Google的Glove, 以及Facebook的Fasttext。我們選擇使用gensim的word2vec實現,來訓練我們自 己的詞向量。gensim是一個第三方開源python工具包,它可以無監督式地從語料 庫中學習得到詞向量。我們需要準備好自己的語料庫,設置好參數,再將語料庫 作為輸入傳入gensim的函數,就可以通過訓練得到詞向量。這里的語料庫指的是 文字集合,對應到我們的數據集中,語料庫就是經過5.2.3 節中的文字清洗后的職 位描述和職位要求。
    以下是訓練詞向量的代碼。我們實現了一個Word2Vec的類,在它的初始化 」nit_函數中實例化了 gensim中的word2vec類,用來作為我們需要訓練的詞向量 模型。訓練詞向量模型的核心代碼是train_model這個函數。train_model函數接受 兩個輸入,trian_corpus和outfile。變量train_corpus是我們的語料庫,outfile是模 型需要保存到的文件名。Mysentences是我們實現的一個生成器,用來快速處理語 料庫中的句子。代碼中調用了 build_vocab方法,它實現的是提取語料庫中的重要 的單詞。調用trian方法,進行詞向量模型訓練,這個方法結束后,self.model就是 已經訓練完的模型了,可以直接使用這個模型來轉換我們數據集中的文字特征。
    以下是訓練詞向量的核心代碼。
    class Word2Vec:
    def _init_(self, logger, size, modelfile=None):
    self?logger = logger
    if not modelfile or (not os.path.exists(modelfile)):
    self.model = gensim.models?Word2Vec(
    size=size,
    window=5,
    min_count=2,
    workers=8,
    iter=50,
    hs=0,
    negative=10,
    sample=1e-4,)
    self?outdir = modelfile
    else:
    self.model = gensim.models?Word2Vec?load(modelfile)
    self?outdir = modelfile
    self.dim = size
    self?stop_words = stopwords?words('english')
    self?tokenizer = RegexpTokenizer(r'\w+')
    self.lmtzr = WordNetLemmatizer()
    def train_model(self, train_corpus, outfile=None):
    if self?logger:
    self?logger?info("build vocab")
    sentences = MySentences(train_corpus, self?logger, 'list')
    self.model? build_vocab(sentences)
    if self?logger:
    self?logger?info("done")
    self?logger?info("train model")
    self.model.train(sentences,
    total_examples=self.model? corpus_count,
    epochs=self.model?iter)
    if outfile or self?model!=None:
    if outfile:
    self.model? save(outfile)
    output_file = outfile
    else:
    self.model? save(self?outdir)
    output_file = self?outdir
    if self?logger:
    self?logger?info("model saved to %s"%output_file)
    需要明確的是,我們最終得到的是詞向量并不是整個語料庫中的所有單詞, 而是經過TF-IDF算法[25]篩選后的重要單詞。TF-IDF算法除了篩選出重要單詞, 還會計算出每個單詞的權值,這個權值表示了每個單詞在預料庫中的重要程度。
    以下通過計算TF-IDF獲取單詞權值的函數。這個函數的輸入df_set還是我們 的語料庫。我們使用了 sklearn 工具包中的 TfidfVectorizer 類,這個類高效實現了 計算TF-IDF的算法。通過實例化TfidfVectorizer,再調用它的fit_transform方法, 我們就能得到單詞的權值,該權值儲存在vectorizer.idf_里。以下是計算單詞權值 核心代碼
    def calculate_word_weights(df_set, out_model_file=None):
    sentences = MySentences(
    df_set, logger=None, out_format='string')
    vectorizer = TfidfVectorizer(stop_words='english')
    X = vectorizer?fit_transform(sentences)
    feature_weights = dict(
    zip(vectorizer?get_feature_names(),
    vectorizer?idf_))
    dict_to_json(feature_weights, out_model_file)
    我們做文字特征提取的主要目的是,用向量的方式表示數據集中的職位描述 和職位要求這兩個特征。因此,我們將這段文字中的重要單詞的詞向量,乘以它 對應的權值,再對所有的向量求和,這樣就得到了這段文字的向量。這種方法可 以簡單地理解為詞向量的加權求和。
    用 python 實現從詞向量到句/段落向量的代碼如下。該函數有兩個入參, sentence 和 weights。 sentence 是一個包含某一段文字的所有重要單詞的 list,(list 是python中的一個常用數據結構)weights是整個語料庫中提取的重要單詞的權值。 我們訓練得到的詞向量是300維,通過該函數得到的某段文字的向量也是 300維。 下面是生成句子和段落向量的核心代碼。
    def infer_with_weighted_sum(self, sentence, weights):
    if not isinstance(sentence, str):
    vecs = [np.zeros((1, self.dim))]
    else:
    vecs =[]
    clean_words = self?clean_text(sentence)
    for word in clean_words:
    t ry:
    word_vec = self?model[word]
    wt = weights[word]
    vecs? append(wt*word_vec)
    except:
    vecs.append(np?zeros((1, self.dim)))
    if len(vecs) == 0:
    vecs = [np.zeros((1, self.dim))]
    return sum(vecs)?flatten()
    5.3推薦模型
    將 4.2.5 中的特征工程得到的特征數據拼接起來,就是我們最后輸入到模型的 數據了。這個輸入的數據是一個MxN的矩陣,其中M是樣本的數量,N是特征 的數量,我們的樣本數M有一百多萬,特征數量N有一千多。我們的推薦模型會 將矩陣作為一個整體進行計算。
    我們的推薦模型可以簡單地理解為分類器,而分類器的作用就是對輸入樣本 進行分類預測,給出輸入樣本屬于每一個分類的概率。具體來說,我們的一個輸 入樣本是一個用戶的個人數據特征和一個職位特征拼接在一起的向量,而推薦模 型的任務就是分析計算這個輸入向量,最終輸出兩個概率值,其中一個概率表示 用戶會對這個職位感興趣,另一個概率表示用戶不會對這個職位感興趣,并且保 證這兩個概率之和為1。但如果逐條地對每一個樣本進行計算,效率明顯就會很低, 因此我們會直接把輸入的矩陣作為整體進行計算。
    經過大量地調研和學習,我們選擇了兩種最適合用于工程中的推薦模型——
    XGBoost 和 Wide&Deep。
    XGBoost[31]是一個基于梯度步進決策樹的算法工具庫,近幾年非常受研究者 和工程師的青睞。根據我們的調研,現在工業界基本都在使用XGBoost進行數據 挖掘或者推薦計算,可以說XGBoost是不二選擇。
    Wide&Deep也是最近很熱門的一個用于推薦的模型。它是Google在2016提 出來的一個既簡單又效果好的深度學習模型。目前國內很多知名企業都在使用以 Wide&Deep 為原型的深度學習模型,因此我們認為它是搭建個性化推薦引擎的首 選。
    為了更進一步提高推薦模型的精準度,我們還使用了一種融合算法, AdaBoost, 將上面提到的兩種模型相融合。融合算法是機器學習中的一個熱門領域,尤其在 數據挖掘和工程實現中用得很多。使用融合算法的初衷是將多個弱分類器結合起 來,以得到更好的分類結果。這在工程上的意義就很大了,在工程上我們往往會 因為計算成本和硬件成本的限制,不選擇使用復雜的模型,而選擇稍微簡單一點 的模型,但同時又希望達到一個很好的效果,這個時候就需要融合算法來提升效 果。由此可見,融合算法在推薦系統中是必不可少的一部分。
    下面我們對XGBoost、Wide&Deep,以及AdaBoost的原理和實現分別進行介紹。
    5.3.1XGBoost 推薦模型
    本節將對XGBoost (Extreme Gradient Boost),進行詳細介紹。我們先簡單介 紹XGBoost中的算法原理和算法步驟,隨后會給出我們的實現代碼。
    XGBoost是基于梯度步進決策樹的模型實現工具庫。決策樹(Decision Tree) 決策樹是一個機器學習中的預測模型,樹種的節點表示某個對象,每個分叉路徑 代表某個可能的屬性值,每個葉節點對應從根節點到葉節點的所有對象的值。每 個決策樹可以依靠對源數據庫的分割進行數據測試。這個過程可以遞歸式的對樹 進行修剪。 當不能再進行分割或一個單獨的類可以被應用于某一分支時,遞歸過 程就完成了。
    在XGBoost模型中,為了訓練決策樹,它使用了迭代增加的訓練方法。核心 思想是,我們每次訓練的樹都是由上一次訓練的樹加上本次訓練的樹,可以理解 為每一步訓練都會對上一步的訓練結果進行修正,把修正結果作為一部分加入到 這一步的訓練中。這個過程用數學表示如下, obj 是我們定義的目標函數。
    obj 二勺(y,,£")) + *(f) (5-1)
    i=1 i=1
    y(0) = 0 (5-2)
    y(1)= f (x,) + f2 (兀)=f2 (xj (5-3)
    y()=工力(xJ = yl:T+ ft (xJ (5-4)
    k=1
    每一步中加入的新樹可以表示為:
    objj)=立(y,, y(T ) + f Q (fi ) = EZ(y,‘ + ft (xi)) + Q (ft) + constant (5-5 )
    i =1 i =1 i =1
    接下來定義正則化項。首先,我們定義Q(力)的復雜度。定義f (x)如下:
    ft(x) = Wq(x), w e RT, q: Rd T {1,2,...,T} (5-6)
    其中 w 是葉子節點的值的向量, q 是將每個數據賦給相應葉子節點的函數, T 是葉子的數量。復雜度則表示為:
    of =YT +勢塞M (5-7)
    有了 4-5中的目標函數以后,XGBoost使用了優化算法對目標函數進行優化。 最常用的優化算法是梯度下降,它的核心是最小化機器學習模型的目標函數,而 這個目標函數中的參數就是模型的參數。換句話說,使用優化算法得到目標函數 最小值時所對應的參數,就是模型的最優參數解。它的具體方式是,在每次迭代 的時候,對參數中的每個變量,按照目標函數在這個變量梯度的反方向,更新對 應的參數值。
    梯度下降僅僅是一個最基礎的算法,但它計算量太大,因此實際使用的優化 算法都是在此基礎上進行改進的算法,比如 GD、 SGD、 Momentum、 RMSprop、 Adam 等[27-30],這些改進的優化算法通常比梯度下降的計算速度快很多,且經過 精調參數后,也能達到相當的效果。
    由于XGBoost沒有公布所使用的優化算法,我們在這里不對XGBoost的優化 算法進行介紹。另外,因為XGBoost是一個工具包,它已經將所有的算法實現封 裝得很好了,所以我們在使用它實現推薦模型的時候只需要根據它的要求設計好 輸入的數據,然后再通過多次試驗,選出最適合我們數據集的超參。超參是指那 些不包含在模型里的參數,這些參數無法通過訓練模型得到,通常只能由經驗法 則和多次試驗獲得一個最好的取值。XGBoost本身可調的超參非常多,我們無法 對每一個參數都進行多次試驗來調整數值,所以我們只選擇幾個關鍵的參數來進 行調參,其它參數均取它們的默認值。我們選取的需要調整的超參有學習率,迭 代次數、樹的總數。學習率是指在優化算法中,每一次沿梯度方向更新的步長。 迭代次數就是訓練中總共需要迭代多少次。樹的總數就是XGBoost算法中,需要 創建的子樹的數目。
    有了以上的基礎理論,下面將介紹利用XGBoost模型對經過數據預處理后的 輸入訓練樣本矩陣進行訓練和預測的詳細步驟。 首先我們實現了 一個 GradientBoostedTree 類。這個類主要實現了 XGBoost 模型中的訓練和預測功能。 然后我們將對輸入訓練樣本矩陣,進行數據類型轉換。調用set_Dmatrix方法,將 其轉換成 XGBoost 中的 DMatrix 類型。接著再調用 train 方法,對轉換后的 Dmatrix 類型的訓練樣本數據進行訓練,得到一個XGBoost中的model實例。接下來再在 預測階段,直接調用model的predict方法,即可求得用戶對每個職位感興趣的概 率。最后根據求得的概率進行排序,選出每個用戶最感興趣的 N 個職位作為推薦 結果。obj函數在XGBoost模型中代表一個優化的目標,用于評判XGBoost運行 狀態。模型訓練的目的就是使obj函數達到最小化。當obj函數達到最小化的時候, 對應的參數就是模型運行的最佳參數。而優化過程就是在模型的訓練過程,在不 斷的迭代里面進行最小化。以下為XGBoost模型的核心代碼:
    class GradientBoostedTree:
    ii ii ii
    Gradient boosted tree
    ii ii ii
    def _init_(self, params=None, num_rounds=None, outdir=None):
    self.model = None
    self?num_rounds = num_rounds
    self.params = params
    self?dtrain = None
    self.dtest = None
    self?outdir = outdir
    def fit(self, X, Y, weight):
    self?dtrain = xgb?Dmatrix(X, Y, weight)
    self?train()
    def train(self, tok=None, callbacks=None, watchlist=None): scores = {} saved_model_fname = None if not watchlist:
    watchlist = [(self?dtrain, 'train'),
    (self.dtest, 'test')]
    self.model = xgb?train(self.params,
    self?dtrain,
    self?num_rounds,
    watchlist,
    early_stopping_rounds=10,
    evals_result=scores,
    callbacks=callbacks, verbose_eval=500)
    if self?outdir:
    maxdepth = self?params['max_depth']
    eta = self?params['eta']
    paramstr = f"{maxdepth}_{eta}"
    saved_model_fname = os.path?join(
    self?outdir, f"{tok}_{self?num_rounds}_{paramstr}?model") self? model? save_model(saved_model_fname)
    return saved_model_fname, scores
    def cv(self, watchlist=None, callbacks=None, customobj=None):
    ii ii ii
    Training with early stopping return best iteration
    ii ii ii
    if not customobj:
    cv = xgb?cv(self.params,
    self?dtrain,
    self?num_rounds,
    nfold=10,
    early_stopping_rounds=5,
    callbacks=callbacks)
    else:
    from utils import logregobj, evalerror
    cv = xgb?cv(self.params,
    self?dtrain,
    self?num_rounds,
    nfold=10,
    callbacks=callbacks,
    obj=logregobj, feval=evalerror, early_stopping_rounds=5,
    verbose_eval=1)
    return cv
    def predict(self, dtest=None, ntree_limit=0): if dtest:
    return self.model?predict( dtest, ntree_limit=ntree_limit) else:
    return self.model?predict( self.dtest, ntree_limit=ntree_limit)
    def load_model(self, fname):
    self.model = xgb.Booster({'nthread':4}) self.model?load_model(fname)
    5.3.2 Wide&Deep 模型
    本節是對 Wide&Deep 模型的詳細介紹。我們同樣先介紹 Wide&Deep 的模型, 然后給出具體的實現代碼。
    Wide&Deep模型是由Google在2016年提出的深度神經網絡模型,后被工 業界大量采用,大量實驗和案例都證明了這個模型的表現力較好。我們都知道, 對于大規模稀疏數據的回歸和分類問題,通常采用非線性特征變換的廣義線性模 型,我們稱之為 wide 模型。在 wide 模型中,通過交叉積的方式,能高效且具可解 釋地對交互特征進行記憶。但這種方法的缺點是需要大量的特征工程。與之相反 地,deep模型通過從稀疏的特征中學習到低緯度的密集embedding,可以生成人們 無法輕易發現的特征組合。Embedding相比于one hot encoding實現了更加簡潔的 數據關系,降低訓練所需要的數據量。不過deep模型的缺點是,當用戶和推薦內 容交互較少的時候,deep模型就會很容易過度生成,并且推薦出不相關的內容。 Wide& Deep 模型則結合了兩種模型,取長補短:通過聯合訓練線性模型和深度 模型,將線性模型的記憶優勢和深度模型的生成優勢結合。
    Wide部分實則是一個線性模型。令y為預測結果,x=[xi,%2,…,也]是我們的 輸入特征,維度為d和w = [wi,w2,^,wj為模型的參數,b是模型的bias。我們的 特征輸入集包含了原始的特征以及變換后的特征。其中,最重要的特征變換就是 交叉積變換了,定義如下:
    d
    札(x)=盯兀% cki g{0,1} (5-8)
    i=1
    于其中,當布爾變量Ck為1,則第i個特征是變換加的一部分,反之為0。
    Deep部分是一個前置神經網絡。對于categorical特征,我們的輸入是特征字 符串。我們先將每個高維度的稀疏特征轉換為低緯度的密集實數向量,也就是我 們說的embedding向量。Embedding向量的維度通常在0(10)到0(100)之間。 Embedding這里采取隨機初始化,在訓練的過程中通過最小化損失函數來得到我們 想要的 embedding 值。
    這里得到的 embedding 緊接著就被傳入下一層隱藏層。隱藏層的計算公式如 下:
    a(l+1) = f(W(l)a(l) +b(l)) (5-9)
    1代表當前的層數,f為激活函數,我們這里采取的是ReLUs。a)是激活函數, 於)是bias,W)是I層的的權值。我們的模型預測公式則表示為:
    P ( Y = 1|x ) = o( WWide [x, 0 ( X )] + 心3 + b ) (5-10)
    其中Y是0或者1,o(•)是sigmoid函數,0(x)是特征x的交叉積,b是bias。 wwde是wide模型的權值,wdieep是deep模型的權值。完整的模型圖如下:
     
     
    圖 5-8 模型圖
    接下來我們詳細介紹是實現wide & deep模型的核心代碼。
    首先給出公式 5-8 的實現,如下所示。它的本質是對兩種特征值的組合的一個
    編碼。
    def val2id(df, cols):
    Helper function to index categorical
    columns before embedding
    val_types= dict()
    for c in cols:
    val_types[c] = df[c]?unique()
    val_to_idx = dict()
    for k,v in val_types?items():
    val_to_idx[k] = {o:i for i,o in enumerate(val_types[k])}
    unique_vals = dict()
    for c in cols:
    unique_vals[c] = df[c]?nunique()
    return df, unique_vals
    下面給出的deep函數針4-16模型圖中右半邊結構部分的深模型,定義了它的 輸入數據的結構。除了直接傳入Deep模型的特征,還通過上面所展示val2id函 數得到交叉特征,將其作為輸入傳到Deep模型中。
    def deep(df_train, df_test, embedding_cols, cont_cols, method):
    """構建Deep模型的輸入"""
    df_train['IS_TRAIN'] = 1
    df_test['IS_TRAIN'] = 0
    df_deep = pd?concat([df_train, df_test])
    df_deep = df_deep?reset_index(drop=True) embedding_cols = \
    [col for col in df_train if 'sku_property_feat' in col] + \ embedding_cols
    cont_cols = \
    [col for col in df_train if 'sku_property_feat' in col] + \ cont_cols
    df_deep, unique_vals = val2idx(df_deep, embedding_cols)
    train = df_deep[df_deep?IS_TRAIN==1]?drop('IS_TRAIN', axis=1)
    test = df_deep[df_deep?IS_TRAIN==0]?drop('IS_TRAIN', axis=1) embeddings_tensors =[]
    n_factors = 8
    reg = 1e-3
    for ec in embedding_cols:
    if isinstance(ec,str):
    layer_name = ec + '_inp'
    else:
    layer_name = str(ec) + '_inp'
    t_inp, t_build = embedding_input(
    layer_name, unique_vals[ec], n_factors, reg)
    embeddings_tensor?append((t_inp, t_build))
    del(t_inp, t_build)
    continuous_tensors =[]
    for cc in cont_cols:
    if isinstance(cc, str):
    layer_name = cc + '_in'
    else:
    layer_name = str(cc) + '_in
    t_inp, t_build = continuous_input(layer_name)
    continuous_tensors?append((t_inp, t_build))
    del (t_inp, t_build)
    X_train = [train[c] for c in deep_cols]
    X_test = [test[c] for c in deep_cols]
    inp_layer = [et[0] for et in embedding_tensors]
    inp_layer += [ct[0] for et in continuous_tensors]
    inp_embed = [et[1] for et in embedding_tensors]
    inp_embed = [ct[1] for et in continuous_tensors]
    return X_train, X_test, inp_embed, inp_layer
    接下來給出Wide模型以及合并Deep和Wide模型的實現代碼。Wide模型本 質上是一個線性模型,構建的時候只需要一層 Dense 層就行了。此外,我們還給 Deep模型額外增加了 attention層。Attention層可以理解為對上一層的每個輸出節 點求一個權值,將求得的權值與節點相乘,輸出到下一層中。最后,我們將兩個 子模型相連接,并且加上一層全連層,再用一個so仕max輸出分類結果。我們最終 得到的結果就是預測輸入用戶對于輸入職位感興趣的概率。
    def wide_deep(df_train, df_test, y_train, \
    y_test, embedding_cols, cont_cols, method):
    """Wide & Deep 模型"""
    embedding_dim = 8
    #歸一化特征值
    scaler = MinMaxScaler()
    X_test_wide = scaler?fit_transform(df_test.values)
    X_train_deep, X_test_deep, deep_inp_embed, deep_inp_layer = \ deep(df_train, df_test, embedding_cols, cont_cols, method)
    X_tr_wd = [X_train_wide] + X_train_deep
    X_te_wd = [X_test_wide] + X_test_deep
    Y_tr_wd = np.array(y_train)?reshape(-1,1)
    Y_te_wd = np.array(y_test)?reshape(-1,1)
    acitvation, loss, metrics = fit_params[method]
    if metrics: metrics = [metrics]
    #構建Wide模型
    w = Input(shape=(X_train_wide?shape[1],)),dtye='float32',name='wide')
    #構建Deep模型
    list_of_attention =[]
    for i, em_input in enumerate(deep_inp_embed):
    if em_input.shape[2] == embedding_dim:
    inp_dim = embedding_dim
    else:
    inp_dim = 1
    # 構建 Attention
    attention.distribution = Dense(inp_dim,activation='sotware',
    name='attention.vec_'+str(i))(em_input) attention_output = merge(
    [em_input,attention_distribution,output_shape=inp_dim,
    name='attention.mul_'+str(i),mode='mul'])
    list_of_attention.append(attention_output)
    d = merge(list_of_attention, mode='concat')
    d = Flatten()(d)
    d = BatchNormaliztion()(d)
     
    d = Dense(100, activation='relu',
    kernel_regularizer=l1_l2(
    l1=0?01,l2=0?02))(d)
    d = Dense(50, activation='relu', name='deep')(d)
    #合并Wide與Deep兩部分,加一層全量層,做一個分類輸岀
    wd_inp = concatenate([w, d])
    wd_out = Dense(Y_tr_wd ?shape[1],activation=activation,
    name='wide_deep')(wd_inp)
    wide_deep = Model(inputs=[w]+deep_inp_layer,outputs=wd_out)
    wide_deep?compile(optimizer=Adam(lr=0?0001),loss=loss,metrics=metrics) wide_deep?fit(X_tr_wd, Y_tr_wd, epochs=5, batch_size=1000, shuffle=True) results = wide_deep?evaluate(X_te_wd, Y_te_wd)
    return wide_deep
    5.3.3模型融合
    有了 XGBoost與Wide&Deep模型后,緊接著需要融合算法將他們結合,來提 高最終的預測準確率。
    模型融合的算法有多種,我們選擇使用AdaBoost算法。AdaBoost是Adaptive Boost的縮寫,中文叫自適應增強,是機器學習中的一種模型融合算法。所謂模型 融合,就是將多個模型以某種形式結合在一起,來提高最終的表現。模型融合算 法有很多種,這里著重介紹AdaBoost的算法。Adaboost的算法如下圖所示。簡單 來說,Adaboost求的是若干個模型的線下疊加,而我們同通過下面的算法得到這 個線下關系式的各項系數。
    1.Initialize the observation weights = 1/7V, i = 1, 2,..., TV.
    2.For m =: 1 to M:
    (a)Fit a classifier Gm(x) to the training data using weights w,
    (b)Compute
     
     
    (c)Compute am = log((l 一 errm)/errm).
    (d)Set ~ * I(s 弄 Gm(①彳))], 2 = 1,2,???,N*
     
    這個算法中的w是一個向量,我們把它作為訓練集中每個樣本的權值,并設 它的初始值為樣1/N,其中N為樣本的總數。M表示已訓練完成的總的模型個數。
    (a)步驟中,將樣本x與w相乘得到的結果作為輸入,傳入當前迭代中的模型 進行訓練。(b)步驟是讓(a)中訓練得到的模型進行一次預測,并計算出錯誤率 errmo (b)步驟中的公式的分母部分是在對當前的樣本的權值向量w求和,分子 部分是求出被錯誤預測的樣板的權值和,最終求得當前的錯誤率errm。(c)步驟 是在計算當前模型在線性融合中的系數它是根據上一步求得的錯誤率errm來 計算的。(d)步驟是在更新樣本的權值向量w,這個公式其實是在讓被預測錯誤 的樣本的權值增加,我們需要用這種方法讓后面的模型專注于修正前面預測錯誤 的樣本。迭代結束后,我們最終融合的模型就是每個模型乘以迭代中求出的對應a 系數的加和。
    以下是AdaBoost實現的python代碼。第20行到第22行是算法中錯誤率的實 現。23行是算法中Qm的實現。24行是算法的(d)步實現,也就是通過求得的Qm來 更新每個樣本的權值的實現。
    def adaboost_clf(Y_train, X_train, Y_test, X_test, clfs):
    n_train, n_test = len(X_train), len(X_test)
    w = np.ones(n_train) / n_train
    pred_train, pred_test = [np?zeros(n_train), np?zeros(n_test)]
    for clf in clfs:
    X_train = np.multiply(X_train,w)
    clf?fit(X_train, Y_train)
    pred_train_i = clf.predict(X_train)
    pred_test_i = clf.predict(X_test)
    miss = [int(x) for x in (pred_train_i != Y_train)]
    miss2 = [x if x==1 else -1 for x in miss]
    err_m = np?dot(w,miss) / sum(w)
    alpha_m = 0?5 * np.log((1-err_m) / float(err_m))
    w = np.multiply(w, np?exp([float(x) * alpha_m for x in miss2]))
    pred_train = [sum(x) for x in zip(pred_train,
    [x * alpha_m for x in pred_train_i])]
    pred_test = [sum(x) for x in zip(pred_test,
    [x * alpha_m for x in pred_test_i])]
    return alpha_m
    第六章 系統的設置與測試
    本章介紹整個系統的實驗設計、使用的實驗數據、實驗的詳細步驟,以及展 示最終的結果。我們的測試主要分為兩大部分,一是數據庫在Java Web中的功能 測試,另一個部分是推薦引擎的性能測試以及在JavaWeb中的功能測試。
    6.1實驗設計
    實驗目的 本實驗目的主要為測試信息管理模塊的功能以及推薦模塊的性能。
    實驗對象
    我們的實驗目的是信息管理模塊和離線推薦計算模塊。
    評測方法
    測試管理模塊功能的方法較為直接,這里不再多做說明。測試推薦引擎的方 法是離線評估多組模型的方法,這里稍作說明。對于推薦系統的評估,一般分為 離線評估和在線評估。離線評估是指,在已有的數據集中對模型訓練并預測評估。 之所以稱之為離線,是因為使用的數據集是歷史數據,并不是實時的數據和反饋。 使用離線評估的好處是,它不需要真實的用戶參與,而且數據集可以很容易得到, 能快速地計算,并且方便測試大量不同算法。但離線評估的不足也很明顯,那就 是它只針對了歷史的數據,并不能真實、完整地反映用戶對推薦系統的真實反饋。 相對地,在線評估就是指,在模型上線以后,通過分流的方法來收集用戶對于推 薦系統的反饋。當然,用戶的反饋被分為了顯示反饋和隱式反饋。顯示反饋就是 用戶對推薦內容的直接評分,比如給一組推薦結果設置滿意和不滿兩個選項讓用 戶進行選擇,這樣得到的評價結果就是顯式反饋。但這種通過顯式反饋的方法收 集到的數據會很少,因為大部分用戶不會進行這樣的打分,尤其是在電商網站, 或者像我們這樣的職位推薦網站,因此能收集到的絕大部分都是隱式反饋。比如, 我們設置兩個前端界面,一個前端界面展示一組不是推薦引擎給出的結果,另一 個界面展示一組推薦引擎給出的推薦結果,然后將用戶分流,對一部分用戶展示 有推薦的界面,對另一部分用戶展示沒有使用推薦引擎的界面,最后我們通過埋 點來獲取頁面上展示的職位的點擊率,從而達到在線評價的效果。這樣通過分流 展示不同界面的方法也稱之為A/B test。由于我們在撰寫論文時沒有條件進行在 線評價,所以在本論文中只給出了離線評價的結果。我們會在后續加入在線評估 的環節,進行A/B test,得到一個真實的用戶反饋。
    評測指標 (推薦計算模塊)
     
    評測指標我們使用了準確率、召回率。需要說明的是,我們的離線實驗是給 用戶推薦一個最適合該用戶的N個職位的推薦列表,這種稱為TopN推薦。下面 給出每一個評測指標的計算公式。
    設R(u)是基于用戶u在訓練集上的行為u給出的top N推薦結果,T(u)是用戶
    在測試集上的行為列表。推薦結果的準確率為:
     
    推薦結果的召回率為:
     
     
     
    6.2實驗數據
    本實驗使用了 Kaggle Job Recommendation Challenge[5]的數據集。該數據集包 含了時長13周的用戶申請簡歷以及發布的職位信息。其中,用戶的申請簡歷被分 為了 7 組,每一組代表了 13天的窗口時間。其中,每個窗口的前 9天作為訓練集, 后四天為測試集。
    每個發布的職位都被分配到一個窗口,并且其概率與該窗口中站點上的活動 時間成正比。每個用戶被分配到一個窗口,其概率與他們在窗口中對他們所提交 的職位申請數成正比。
    我們需要預測用戶在該窗口的測試期會申請哪些職位。
    Data Layout
    Window 1 Window 3 Window 7
     
     
    13 weeks split into 7 windows
    圖 6-1 數據集窗口分布圖
     
    Assigning Users to Windows
    Userl
    Activity >
    Period Activity
    Period
    Training ? lest
    Window 1 Training 滄久
    Window 2
     
    圖 6-1 用戶申請分布圖
    用戶的歷史申請數據內容如下圖,圖中展示了歷史申請數據中的五個數據樣 本。可以看到,歷史申請數據包含了五個維度的數據,分別是用戶ID,窗口 ID, 數據類型Split,申請日期ApplicationDate,和職位ID。這里的窗口 ID對應上述的 七個窗口 ;數據類型Split的取值有Train和Test兩種,分別代表了對應樣本屬于 訓練集或測試集。
    UserID WindowID Split ApplicationDate JoblD
    0 47 1 Train 2012-04-04 15:56:23.537 169528
    1 47 1 Train 2012-04-06 01:03:00.003 284009
    2 47 1 Train 2012-04-05 02:40:27.753 2121
    3 47 1 Train 2012-04-05 02:37:02.673 848187
    4 47 1 Train 2012-04-05 22:44:06.653 733748
     
    圖 6-2 用戶歷史申請數據示意圖
    用戶的個人數據包括了用戶ID、窗口 ID、所在城市、州、郵編、學歷、專業、 畢業日期、有過幾份工作、工作經驗(年)、目前是否在職、有無管理經驗、管理 過多少人。
     
     
    WorkHistoryCount
    TotalYears Experience
    CurrentlyEmployed ManagedOthers
     
    GraduationDate
     
    Man agedHowMany
    圖 6-3
    用戶個人信息數據示意圖
    職位數據包括了職位ID、窗口 ID、職位名稱、崗位職責描述、崗位要求、職
    位所在的城市、州、國家、郵編、職位可申請的起始日期。
    JoblD WindowID
    Title
    Description
    Security
    Engin eer/Tech nical
    Lead
    <p>Security Clearance
    Required:&nbsp; Top Seer...
    SAP Business Analyst
    /WM
    <strong>NO Corp, to Corp resumes^nbsp;a「e bein...
    P/T HUMAN
    RESOURCES
    ASSISTANT
    <b> <b> P/T HUMAN RESOURCES ASSISTANT</b> <...
    Route Delivery Drivers
    CITY BEVERAGES Come to work for the best in th...
    Housekeepi ng
    I make sure every part of their day is magica...
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    Requireme nts City State Country Zip5 StartDate En dDate
    <p>SKILL SET </p>\r<p>&nbsp; </p>\r<p>Network Se... Washington DC US 20531 2012-03-07
    13:17:01.643 2012-04
    06
    23:59:59
    <p><b>WHAT YOU NEED: </b></p>\r<p>Four year co... Charlotte NC US 28217 2012-03-21
    02:03:44.137 2012-04
    20
    23:59:59
    Please refer to the Job
    Description to view th... Winter Park FL US 32792 2012-03-02
    16:36:55.447 2012-04
    01
    23:59:59
    Please refer to the Job
    Description to view th... Orlando FL US NaN 2012-03-03
    09:01:10.077 2012-04
    02
    23:59:59
    Please refer to the Job
    Description to view th... Orlando FL US NaN 2012-03-03
    09:01:11.88 2012-04
    02
    23:59:59
    圖 6-4 職位信息示意圖
     
    6.3實驗步驟
    實驗步驟總體分為兩個部分,首先我們測試的是信息模塊的功能,接著測試推 薦模塊的性能表現。
    信息模塊功能測試步驟如下:
    1.登錄功能測試
    2.管理員功能測試
    > 主頁展示
    >設置系統全局信息
    >查看及編輯考試信息
    >查看及編輯教師信息
    >查看及編輯學生信息
    >查看及編輯教師信息
    >查看及編輯年級信息
    >查看及編輯班級信息
    >查看及編輯課程信息
    >查看所有職位信息
    3.教師功能測試
    > 主頁展示
    >查看及添加考試和成績
    >查看教師通訊錄
     
    >查看及編輯個人信息
    4.學生功能測試
    > 主頁展示
    >查看考試及成績信息
    >查看同班同學通訊錄
    >查看及編輯個人信息
    >查看推薦職位信息
    >查看所有職位信息
    推薦模塊性能測試步驟如下:
    1.數據預處理,包括清洗數據,特征工程。(參考 4.2 節)
    2.將 80%的數據集作為訓練集,20%的數據集測試集
    3.在訓練樣本集上訓練 XGBoost 模型并調參
    4.在訓練樣本集上訓練 Wide&Deep 模型并調參
    5.用 AdaBoost 融合 2、3 中的兩個模型
    6.4 中的模型以及前文2、3 中的模型分別在測試集上進行預測
    7.分析結果
    數據預處理部分我們在 4.2節已經做了詳細的介紹,這里稍作重復。首先,我 們將連續特征進行歸一化處理,同時對所有的類別特征進行one-hot encoding,再 對文字特征進行 word2vec 轉化。其中, word2vec 轉化是指,在我們數據集上收集 得到一個語料庫,在這個語料庫上訓練一個神經網絡模型,這個模型會將一句文 字轉化成一個固定長度的向量。有了 word2vec模型以后,我們就可以將數據集中 的文字類特征,也就是職業數據中的的Title、描述、要求三類特征,分別轉化成 三個固定長度的向量。此外,在進行one-hot encoding的時候,我們還做了一個降 維,減小了輸入數據的維度,使得運算更快效率跟高。
    有了處理好的輸入特征以后,我們將特征分別用來訓練上述的兩種模型。在 訓練每種模型的時候,除了模型自身訓練得到的參數以外,還有非訓練的參數, 我們稱之為超參。這些超參需要我們通過多次實驗,找出最優參數值。這個通過 多次實驗尋找最優超參的過程,我們稱之為調參。為了進行調參,我們需要用 K-fold 交叉驗證的方法。這里對K-fold交叉驗證進行簡單的介紹。
    交叉驗證是一種重采樣程序,用于評估有限數據樣本的機器學習模型。該過 程有一個名為k的參數,它指的是給定數據樣本要拆分的組數。因此,該過程通 常稱為k折交叉驗證。K-fold交叉驗證的步驟如下。
    1.隨機混洗數據集。
    2.將數據集拆分為k個組
    3.對于每個獨特的群體:
    a 將該組作為保留或測試數據集
    b 將剩余的組作為訓練數據集
    c 在訓練集上擬合模型并在測試集上進行評估
    d 保留評估分數并丟棄模型
    4.使用模型評估分數樣本總結模型的技能 使用這種算法以后,樣本中的每個觀察結果都被分配給一個單獨的組,并在
    該過程的持續時間內保留在該組中,從而每個樣本都有機會在保持集 1中使用并 用于訓練模型 k-1 次。這里我們結合數據和實際表現,選擇了 K=5 進行交叉驗證。
    以下是實現交叉驗證的核心代碼。
    def cv(self, watchlist=None, callbacks=None, customobj=None):
    ii ii ii
    交叉訓練
    II II II
    if not customobj:
    cv = xgb?cv(self.params,
    self?dtrain,
    self?num_rounds,
    nfold=10,
    early_stopping_rounds=5,
    callbacks=callbacks)
    else:
    from utils import logregobj, evalerror
    cv = xgb?cv(self.params,
    self?dtrain,
    self?num_rounds,
    nfold=10,
    callbacks=callbacks, obj=logregobj, feval=evalerror, early_stopping_rounds=5, verbose_eval=1)
    return cv
    經過交叉驗證以后得到每個模型的最佳參數以及超參。然后我們使用 5.3.3 節 中的AdaBoost算法,將兩個模型進行融合,得到一個融合的模型。最后,我們分 別讓目前所得到的所有模型在預測集上進行預測,得到各自的最終結果。
     
    6.4實驗結果
    6.4.1信息模塊實驗結果
    1. 登錄功能
     
    圖 6-5 登錄界面圖
     
    該頁面中,完成了通過輸入用戶名、密碼、驗證碼以及選擇相應的身份(學 生、老師或管理員)以登錄到網站系統中的功能。
    2. 管理員功能
    • 首頁展示
     
    圖 6-6 管理員登錄后首頁界面圖
     
    圖6-6為管理員成功登錄后的首頁。左邊的Navigation Menue是導航欄,上面
    分別有五個可下拉的菜單,分別是Exam Managements (考試及成績管理),Student Managemen(t 學生管理), Teacher Managemen(t 教師管理), General Info Management (其他信息管理),System (系統設置)。
    • 設置系統全局信息
    點擊System欄后展開下拉菜單,選擇Settings后右側顯示系統設置的界面。
    Reset g Reset Password
    University Name:
    Prohibited Teacher
    Log in
    Prohibited Student
    Log in
    Teacher Notification:
    該界面提供了五個主要設置項,分別是修改學校名稱(University Name),是 否禁止教師用戶登錄(Prohibit Teacher Login),是否禁止學生用戶登錄(Prohibit Student Login),給教師的首頁通知(Teacher Notification),以及給學生的首頁通知 (Student Notification) o此外,該界面的左上角分別實現了 Reset (重置所有輸入 框內容)功能和Reset Password (重置管理員密碼)功能。重置所有修改的功過于 簡單,這里不再展示。下圖是點擊Reset Password按鈕后彈出的窗口界面。彈出的 窗口中需要輸入舊的密碼的兩次輸入新設置的密碼,填好后點提交。隨后會彈出 設置成功并強制跳轉到登錄界面重新登錄的對話框。
     
    圖 6-8 重置密碼編輯界面
     
    圖 6-9 密碼重置成功界面
    •查看及編輯考試信息
    選擇左側Navigation Menu中第一欄Exam Management (考試管理),再選擇 下拉菜單中的Exam List,右側顯示所有考試信息表格。界面截圖如下。
    Information Management System
    Navigation Menu Welcome!三 Exam List >;
    Exam Management ;Exams List
    ;z Exam List $Add §「emove || Caculate Grade: v Class:
     
    (Exam Name Exam Date Exam Type Grade ofExarr i Class of Exam Subject of Exam Comments
    1 0 midterm 2019-03-27 Midterm Exam Fourth Year Class 2 Computer Science II Computer Science II Midterm
    2 midterm 2019-03-27 Midterm Exam Fourth Year Class 1 Computer Science II Computer Science II Midterm
    3 [」m就erm 2019-03-27 Midterm Exam Third Year Class 2 Computer Science I Computer Science I Midterm
    4 U midtenn 2019-03-27 Midterm Exam Third Year Class 1 Computer Science I Computer Science I Midterm
    5 U midterm 2019-03-27 Midterm Exam Second Year Class 2 Calculus II Calculus II Midterm
    6 Q midtenn 2019-03-27 Midterm Exam Second Year Class 1 Calculus II Calculus II Midterm
    7 1」m就erm 2019-03-27 Midterm Exam First Year Class 2 Calculus I Calculus I Midterm
    8 midterm
    2019-03-27 Midterm Exam First Year Class 1 Calculus I Calculus I Midterm
    9 final 2019-05-04 Final Exam Fourth Year Class 2 Software Engineering II Software Engineering II Final
    10 final 2019-05-04 Final Exam Fourth Year Class 1 Software Engineering II Software Engineering II Final
     
    圖 6-10 考試管理界面
     
    在該界面中,我們展示了當前所有考試的信息,包括考試名稱、時間、科目 名字、年級、班級。
    同時,我們加入了工具欄,以實現對考試信息的增添、刪除和修改。 下圖是點擊 Add 按鈕后彈出的添加考試的窗口。
     
    圖 6-11 添加考試科目界面
     
     
    我們添加了名為 Wireless Security 的考試,點擊添加提交結果以后,系統會自 動為所選年級的所有班級添加該門考試。
    • 查看及編輯學生信息
    選擇左側Navigation Menu中第二欄Student Management (學生管理),再選擇 下拉菜單中的StudentList,右側顯示所有學生信息表格。界面截圖如下
     
    圖 6-12 學生信息編輯界面
    該界面展示了學生信息,并且有添加、修改和刪除的功能。添加和刪除的界 面與之前的類似,之里直接給出更新學生信息的窗口。
    • 查看及編輯教師信息
    選擇左側Navigation Menu中第三欄Teacher Management (教師管理),再選擇 下拉菜單中的Teacher List,右側顯示所有教師信息表格。界面截圖如下。篇幅有 限,這里不再重復貼出類似的編輯窗口界面。
     
    圖 6-13 教師信息編輯界面
     
    • 查看及編輯年級、班級、課程、職位信息
    選擇左側 Navigation Menu 中第四欄 General Info Managemen(t 其他信息管理), 下拉菜單中有Grade List (年級列表)、Class List (班級列表)、Course List (課程 列表)以及Job List (職位列表)。下面以最復雜的Job List (職位列表)圖舉例展 示。
    由于我們的職位數據文字內容較多,一個頁面只夠顯示一個職位的信息,所 以我們用了兩張截圖來分別展示表格中前兩個職位的內容。
     
     
     
     
    圖 6-14 職位信息編輯界面
     
     
    圖 6-15 職位信息編輯界面
    3. 教師功能
    • 首頁展示
     
    r cd o* I i riwix info” x +
    V- - Q! Q kx«<IK< >->i ^ ^ ,
    Information Management System
    Z«av2«*U。" M«2<bu
    I «>M<-hnw*nt MAnxQ«*«rw*mt tea<=K«r I nfo
    Sy^Ccru Mdfidvctaidil
    Welcome to Information Management System
    News:
    Please upload grade ASAP.
    圖 6-16 教師登錄后界面
    • 查看及添加考試和成績
     
     
     
     
     
     
     
     
     
     
     
     
    圖 6-17 考試編輯界面 (1)
    以下是點擊添加按鈕后彈出的添加窗口界面。
     
     
    圖 6-18 考試編輯界面 (2)
    點擊 enter score 按鈕以后的添加/修改學生考試成績的窗口界面
     
     
    圖 6-19 成績編輯界面
    • 查看及編輯個人信息
     
     
    圖 6-20 教師個人信息編輯界面
    4. 學生功能
    • 首頁展示
     
     
     
     
     
     
    圖 6-21 學生登錄后界面
    •查看考試及成績信息
    圖 6-22 學生成績查看界面
    • 查看及編輯個人信息
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    圖 6-23 學生個人信息編輯界面
     
    • 查看推薦職位信息 同樣,由于我們的職位數據文字內容較多,一個頁面只夠顯示一個職位的信 息,所以我們用了兩張截圖來分別展示表格中前兩個推薦的職位的內容。
     
     
    圖 6-23 就業信息推薦界面(1)
    圖 6-24 就業信息推薦界面(2)
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    6.4.2推薦引擎實驗結果
    圖 4-13 為訓練和測試的損失函數曲線。紅色為訓練集的 loss ,藍色為測試集, 可loss。可以看到,我們的模型能夠很快地收斂并且達到一個不錯的效果。最終, 我們的模型在訓練集上能達到90%的準確率,在測試集上達到了 88%的準確率。
    表 6-1 實驗數據表
    模型 Precision Recall
    GBDT 0.886 0.7126
    Wide 0.921 0.7265
    Deep 0.913 0.7221
    Wide & Deep 0.981 0.7280
    Ensembled 0.987 0.782
     
     
    learning curve
    0.5
     
    0.0
    0 25 50 75 100 125 150 175 200
    iteration
     
    圖 6-25 訓練和測試的損失函數曲線圖
    第七章 總結與展望
    7.1總結
    隨著電子化數據管理系統在各級高校的普及,這部分數據對于就業領域是極 具價值的,本論文因地制宜,使用當下火熱的人工智能技術來對傳統的數據管理 系統進行數據分析,在測試集上的可以得到就業情況預測準確率達 90%的試驗結 果,可以說是非常令人振奮的,這進一步論證了使用人工智能技術進行數據分析 和預測在就業領域的使用價值和應用前景。
    7.2展望
    文雖然程序模型在測試數據集上效果良好,但是因為樣本量不足,模型沒有 辦法進一步完善,如果將來應用到現實中可以使用更大的樣本進行訓練來調整參 數,同時可以根據需求進一步細分參數,可以得到更加精細的預測結果使得系統 更加可用。
    致謝
    在完成該論文之時,我要由衷的感謝給予我關心、支持和幫助的各位導師、 和同學。
    其中,首先要感謝我的導師李瑞教授。在李老師耐心細致的指導下,使我能 利用研究生三年所學的基礎知識制定畢業論文的課題方向,并順利的通過了開題 報告。在課題方向確定后,從資料查詢,到論文撰寫,再到最后的論文成型,我 遇到很多的疑惑和困難。李老師花費了很多寶貴的時間和精力與我答疑解惑,給 予我許多的啟迪和自信,使我在研究生學習上受益匪淺。同時,李老師嚴謹的治 學態度,開拓進取的精神和高度的責任心都使我受益終生。
    同時我還要向李先進教授級高工表示感謝,在論文撰寫過程中,多次在百忙 中擠出時間對我精心指導,對各類問題不厭其煩給我指正和解惑。
    在此我再次向所有關心我、支持我、幫助我的老師、親友、同學表示衷心的 感謝!
    參考文獻
    [1]Goldberg, D., Nichols, D., Oki, B.M., Terry, D.: Using collaborative filtering to weave an information Tapestry. Commun. ACM 35(12), 61—70 (1992)
    [2]Resnick, P., Iacovou, N., Suchak, M., Bergstrom, P., Riedl, J.: GroupLens: an open architecture for collaborative filtering of netnews. In: Proceedings of the 1994 ACMconference on Computer supported cooperative work, pp. 175-186 (1994)
    [3]Anderson, Chris. "The Long Tail" Wired, October 2004.
    [4]"Kernel-Mapping Recommender system algorithms". Information Sciences. 208: 81-104. doi: 10.1016/j.ins.2012.04.012
    [5]https://www.kaggle.com/c/job-recommendation/data
    [6]"Artificial Neural Networks as Models of Neural Information Processing | Frontiers Research Topic". Retrieved 2018-02-20.
    [7]Ganesan, N. "Application of Neural Networks in Diagnosing Cancer Disease Using Demographic Data" (PDF). International Journal of ComputerApplications.
    [8]Nabian, Mohammad Amin; Meidani, Hadi (2017-08-28). "Deep Learning for Accelerated Reliability Analysis of Infrastructure Networks". Computer-Aided Civil and Infrastructure Engineering. 33 (6): 443-458. arXiv:1708.08551.doi:10.1111/mice.12359
    [9]Nabian, Mohammad Amin; Meidani, Hadi (2018). "Accelerating Stochastic Assessment of Post-Earthquake Transportation Network Connectivity via Machine-Learning-Based Surrogates". Transportation Research Board 97th Annual Meeting.
    [10]null null (2000-04-01). "Artificial Neural Networks in Hydrology. I: Preliminary Concepts".
    Journal of Hydrologic Engineering. 5 (2): 115-123. CiteSeerX 10.1.1.127.3861.
    doi:10.1061/(ASCE)1084-0699(2000)5:2(115)
    [11]null null (2000-04-01). "Artificial Neural Networks in Hydrology. II: Hydrologic Applications".
    Journal of Hydrologic Engineering. 5 (2): 124-137.
    doi:10.1061/(ASCE)1084-0699(2000)5:2(124)
    [12]Peres, D. J.; Iuppa, C.; Cavallaro, L.; Cancelliere, A.; Foti, E. (2015-10-01). "Significant wave height record extension by neural networks and reanalysis wind data". Ocean Modelling. 94: 128-140. Bibcode:2015OcMod..94..128P. doi:10.1016/j.ocemod.2015.08.002
    [13]Dwarakish, G. S.; Rakshith, Shetty; Natesan, Usha (2013). "Review on Applications of Neural Network in Coastal Engineering". Artificial Intelligent Systems and Machine Learning. 5 (7):
    324-331.
    [14]Ermini, Leonardo; Catani, Filippo; Casagli, Nicola (2005-03-01). "Artificial Neural Networks applied to landslide susceptibility assessment". Geomorphology. Geomorphological hazard and human impact in mountain environments. 66 (1): 327-343.
    [15]UNESCO (2012) Education and Skills for Inclusive and Sustainable Development beyond 2015
    [16]Qu, X.F., Zhang, J. and Wang, Y. (2015) A Study on College Graduates Employment Situation. Brand, 4, 154.
    [17]Zhou, Y. (2015) A Study on the Employment View Problems and Countermeasures of College Students. Brand, 1, 176.
    [18]Chen, X.M. (2014) The Research on University Students' Employment under the Multidimensional Perspective. China Electric Power Education, 2, 227-229.
    [19]Ai, L.R. (2015) Study on Undergraduates Employment Ideological Education Practice. Creative Education, 6, 309-314.
    [20]Dai, L.T. and Xiao, R. (2016) The Influence of Social Comparison on Job Performance. Open Journal of Social Sciences, 4, 147-151.
    [21]Wang, D.J., Zhu, Q.X. and Lin, Y. (2013) Study on the Problems Existing in the Employment Education for College Students in China's Independent Colleges and Corresponding Countermeasures. Creative Education, 4, 470-473.
    [22]Usage of Java for websites report https://w3techs.com/technologies/- details/cp-javaruntime/all/all
    [23]Mikolov, Tomas, et al. "Distributed representations of words and phrases and their compositionality." Advances in neural information processing systems. 2013.
    [24]De Lathauwer, Lieven, Bart De Moor, and Joos Vandewalle. "A multilinear singular value decomposition." SIAM journal on MatrixAnalysis and Applications 21.4 (2000): 1253-1278.
    [25]Rajaraman, Anand, and Jeffrey David Ullman. Mining of massive datasets. Cambridge University Press, 2011.
    [26]Kiefer, Jack, and Jacob Wolfowitz. "Stochastic estimation of the maximum of a regression function." The Annals of Mathematical Statistics 23.3 (1952): 462-466.
    [27]Robbins, Herbert, and Sutton Monro. "A stochastic approximation method." The annals of mathematical statistics(1951): 400-407.
    [28]Qian, Ning. "On the momentum term in gradient descent learning algorithms." Neural networks 12.1 (1999): 145-151.
    [29]Tieleman, Tijmen, and Geoffrey Hinton. "Lecture 6.5-rmsprop: Divide the gradient by a running average of its recent magnitude." COURSERA: Neural networks for machine learning 4.2 (2012): 26-31.
    [30]Kingma, Diederik P., and Jimmy Ba. "Adam: A method for stochastic optimization." arXiv preprint arXiv:1412.6980(2014).
    [31]Chen, Tianqi, and Carlos Guestrin. "Xgboost: A scalable tree boosting system." Proceedings of the 22nd acm sigkdd international conference on knowledge discovery and data mining. ACM, 2016.
    【本文地址:http://www.bzhlmm.com//guanlilei/gongshangguanli/xixinguanli/5852.html

    上一篇:運營公路隧道土建結構定期檢查病害信息 管理系統研究

    下一篇:基于MVC和ExtJS的高校學生信息管理系統的 設計與實現

    相關標簽: