Python機(jī)器學(xué)習(xí)實(shí)踐指南_第1頁
Python機(jī)器學(xué)習(xí)實(shí)踐指南_第2頁
Python機(jī)器學(xué)習(xí)實(shí)踐指南_第3頁
Python機(jī)器學(xué)習(xí)實(shí)踐指南_第4頁
Python機(jī)器學(xué)習(xí)實(shí)踐指南_第5頁
已閱讀5頁,還剩300頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

\hPython機(jī)器學(xué)習(xí)實(shí)踐指南目錄\h第1章Python機(jī)器學(xué)習(xí)的生態(tài)系統(tǒng)\h1.1數(shù)據(jù)科學(xué)/機(jī)器學(xué)習(xí)的工作流程\h1.1.1獲取\h1.1.2檢查和探索\h1.1.3清理和準(zhǔn)備\h1.1.4建模\h1.1.5評(píng)估\h1.1.6部署\h1.2Python庫和功能\h1.2.1獲取\h1.2.2檢查\h1.2.3準(zhǔn)備\h1.2.4建模和評(píng)估\h1.2.5部署\h1.3設(shè)置機(jī)器學(xué)習(xí)的環(huán)境\h1.4小結(jié)\h第2章構(gòu)建應(yīng)用程序,發(fā)現(xiàn)低價(jià)的公寓\h2.1獲取公寓房源數(shù)據(jù)\h使用import.io抓取房源數(shù)據(jù)\h2.2檢查和準(zhǔn)備數(shù)據(jù)\h2.2.1分析數(shù)據(jù)\h2.2.2可視化數(shù)據(jù)\h2.3對(duì)數(shù)據(jù)建模\h2.3.1預(yù)測(cè)\h2.3.2擴(kuò)展模型\h2.4小結(jié)\h第3章構(gòu)建應(yīng)用程序,發(fā)現(xiàn)低價(jià)的機(jī)票\h3.1獲取機(jī)票價(jià)格數(shù)據(jù)\h3.2使用高級(jí)的網(wǎng)絡(luò)爬蟲技術(shù)檢索票價(jià)數(shù)據(jù)\h3.3解析DOM以提取定價(jià)數(shù)據(jù)\h通過聚類技術(shù)識(shí)別異常的票價(jià)\h3.4使用IFTTT發(fā)送實(shí)時(shí)提醒\h3.5整合在一起\h3.6小結(jié)\h第4章使用邏輯回歸預(yù)測(cè)IPO市場(chǎng)\h4.1IPO市場(chǎng)\h4.1.1什么是IPO\h4.1.2近期IPO市場(chǎng)表現(xiàn)\h4.1.3基本的IPO策略\h4.2特征工程\h4.3二元分類\h4.4特征的重要性\h4.5小結(jié)\h第5章創(chuàng)建自定義的新聞源\h5.1使用Pocket應(yīng)用程序,創(chuàng)建一個(gè)監(jiān)督訓(xùn)練的集合\h5.1.1安裝Pocket的Chrome擴(kuò)展程序\h5.1.2使用PocketAPI來檢索故事\h5.2使用embed.lyAPI下載故事的內(nèi)容\h5.3自然語言處理基礎(chǔ)\h5.4支持向量機(jī)\h5.5IFTTT與文章源、Google表單和電子郵件的集成\h通過IFTTT設(shè)置新聞源和Google表單\h5.6設(shè)置你的每日個(gè)性化新聞簡報(bào)\h5.7小結(jié)\h第6章預(yù)測(cè)你的內(nèi)容是否會(huì)廣為流傳\h6.1關(guān)于病毒性,研究告訴我們了些什么\h6.2獲取分享的數(shù)量和內(nèi)容\h6.3探索傳播性的特征\h6.3.1探索圖像數(shù)據(jù)\h6.3.2探索標(biāo)題\h6.3.3探索故事的內(nèi)容\h6.4構(gòu)建內(nèi)容評(píng)分的預(yù)測(cè)模型\h6.5小結(jié)\h第7章使用機(jī)器學(xué)習(xí)預(yù)測(cè)股票市場(chǎng)\h7.1市場(chǎng)分析的類型\h7.2關(guān)于股票市場(chǎng),研究告訴我們些什么\h7.3如何開發(fā)一個(gè)交易策略\h7.3.1延長我們的分析周期\h7.3.2使用支持向量回歸,構(gòu)建我們的模型\h7.3.3建模與動(dòng)態(tài)時(shí)間扭曲\h7.4小結(jié)\h第8章建立圖像相似度的引擎\h8.1圖像的機(jī)器學(xué)習(xí)\h8.2處理圖像\h8.3查找相似的圖像\h8.4了解深度學(xué)習(xí)\h8.5構(gòu)建圖像相似度的引擎\h8.6小結(jié)\h第9章打造聊天機(jī)器人\h9.1圖靈測(cè)試\h9.2聊天機(jī)器人的歷史\h9.3聊天機(jī)器人的設(shè)計(jì)\h9.4打造一個(gè)聊天機(jī)器人\h9.5小結(jié)\h第10章構(gòu)建推薦引擎\h10.1協(xié)同過濾\h10.1.1基于用戶的過濾\h10.1.2基于項(xiàng)目的過濾\h10.2基于內(nèi)容的過濾\h10.3混合系統(tǒng)\h10.4構(gòu)建推薦引擎\h10.5小結(jié)第1章Python機(jī)器學(xué)習(xí)的生態(tài)系統(tǒng)機(jī)器學(xué)習(xí)正在迅速改變我們的世界。作為人工智能的核心,我們幾乎每天都會(huì)讀到機(jī)器學(xué)習(xí)如何改變?nèi)粘5纳?。一些人認(rèn)為它會(huì)帶領(lǐng)我們進(jìn)入一個(gè)風(fēng)格奇異的高科技烏托邦;而另一些人認(rèn)為我們正邁向一個(gè)高科技天啟時(shí)代,將與竊取我們工作機(jī)會(huì)的機(jī)器人和無人機(jī)敢死隊(duì)進(jìn)行持久的戰(zhàn)爭。不過,雖然權(quán)威專家們可能會(huì)喜歡討論這些夸張的未來,但更為平凡的現(xiàn)實(shí)是,機(jī)器學(xué)習(xí)正在快速成為我們?nèi)粘I畹墓潭ㄑb備。隨著我們微小但循序漸進(jìn)地改進(jìn)自身與計(jì)算機(jī)以及周圍世界之間的互動(dòng),機(jī)器學(xué)習(xí)正在悄悄地改善著我們的生活。如果你在A這樣的在線零售商店購物,使用Spotify或Netflix這樣的流媒體音樂或電影服務(wù),甚至只是執(zhí)行一次Google搜索,你就已經(jīng)觸碰到了機(jī)器學(xué)習(xí)的應(yīng)用。使用這些服務(wù)的用戶會(huì)產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)會(huì)被收集、匯總并送入模型,而模型最終會(huì)為每個(gè)用戶創(chuàng)建個(gè)性化的體驗(yàn)來完善服務(wù)。想要深入到機(jī)器學(xué)習(xí)應(yīng)用的開發(fā)中,現(xiàn)在就是一個(gè)理想的時(shí)機(jī)。你會(huì)發(fā)現(xiàn),Python是開發(fā)這些應(yīng)用的理想選擇。Python擁有一個(gè)深度的、活躍的開發(fā)者社區(qū),許多開發(fā)者也來自科學(xué)家的社區(qū)。這為Python提供了一組豐富的科學(xué)計(jì)算庫。在本書中,我們將討論并使用這些來自Python科學(xué)棧的庫。在接下來的章節(jié)中,我們將一步步學(xué)習(xí)如何建立各種不同的機(jī)器學(xué)習(xí)應(yīng)用。但是,在真正開始之前,我們將使用本章剩下的篇幅討論這些關(guān)鍵庫的特性,以及如何準(zhǔn)備能充分利用它們的環(huán)境。我們將在本章中介紹以下主題。數(shù)據(jù)科學(xué)/機(jī)器學(xué)習(xí)的工作流程。工作流中每個(gè)階段的庫。設(shè)置你的環(huán)境。1.1數(shù)據(jù)科學(xué)/機(jī)器學(xué)習(xí)的工作流程打造機(jī)器學(xué)習(xí)的應(yīng)用程序,與標(biāo)準(zhǔn)的工程范例在許多方面都是類似的,不過有一個(gè)非常重要的方法有所不同:需要將數(shù)據(jù)作為原材料來處理。數(shù)據(jù)項(xiàng)目成功與否,很大程度上依賴于你所獲數(shù)據(jù)的質(zhì)量,以及它是如何被處理的。由于數(shù)據(jù)的使用屬于數(shù)據(jù)科學(xué)的領(lǐng)域,理解數(shù)據(jù)科學(xué)的工作流程對(duì)于我們也有所幫助:整個(gè)過程要按照?qǐng)D1-1中的順序,完成六個(gè)步驟:獲取,檢查和探索,清理和準(zhǔn)備,建模,評(píng)估和最后的部署。在這個(gè)過程中,還經(jīng)常需要繞回到之前的步驟,例如檢查和準(zhǔn)備數(shù)據(jù),或者是評(píng)估和建模,但圖1-1所示的內(nèi)容可以描述該過程較高層次的抽象。圖1-1現(xiàn)在讓我們?cè)敿?xì)討論每一個(gè)步驟。1.1.1獲取機(jī)器學(xué)習(xí)應(yīng)用中的數(shù)據(jù),可以來自不同的數(shù)據(jù)源,它可能是通過電子郵件發(fā)送的CSV文件,也可能是從服務(wù)器中拉取出來的日志,或者它可能需要構(gòu)建自己的Web爬蟲。數(shù)據(jù)也可能存在不同的格式。在大多數(shù)情況下,它是基于文本的數(shù)據(jù),但稍后將看到,構(gòu)建處理圖像甚至視頻文件的機(jī)器學(xué)習(xí)應(yīng)用,也是很容易的。不管是什么格式,一旦鎖定了某種數(shù)據(jù),那么了解該數(shù)據(jù)中有什么以及沒有什么,就變得非常重要了。1.1.2檢查和探索一旦獲得了數(shù)據(jù),下一步就是檢查和探索它們。在這個(gè)階段中,主要的目標(biāo)是合理地檢查數(shù)據(jù),而實(shí)現(xiàn)這一點(diǎn)的最好辦法是發(fā)現(xiàn)不可能或幾乎不可能的事情。舉個(gè)例子,如果數(shù)據(jù)具有唯一的標(biāo)識(shí)符,檢查是否真的只有一個(gè);如果數(shù)據(jù)是基于價(jià)格的,檢查是否總為正數(shù);無論數(shù)據(jù)是何種類型,檢查最極端的情況。它們是否有意義?一個(gè)良好的實(shí)踐是在數(shù)據(jù)上運(yùn)行一些簡單的統(tǒng)計(jì)測(cè)試,并將數(shù)據(jù)可視化。此外,可能還有一些數(shù)據(jù)是缺失的或不完整的。在本階段注意到這些是很關(guān)鍵的,因?yàn)樾枰谏院蟮那逑春蜏?zhǔn)備階段中處理它。只有進(jìn)入模型的數(shù)據(jù)質(zhì)量好了,模型的質(zhì)量才能有保障,所以將這一步做對(duì)是非常關(guān)鍵的。1.1.3清理和準(zhǔn)備當(dāng)所有的數(shù)據(jù)準(zhǔn)備就緒,下一步是將它轉(zhuǎn)化為適合于模型使用的格式。這個(gè)階段包括若干過程,例如過濾、聚集、輸入和轉(zhuǎn)化。所需的操作類型將很大程度上取決于數(shù)據(jù)的類型,以及所使用的庫和算法的類型。例如,對(duì)于基于自然語言的文本,其所需的轉(zhuǎn)換和時(shí)間序列數(shù)據(jù)所需的轉(zhuǎn)換是非常不同的。全書中,我們將會(huì)看到一些轉(zhuǎn)換的的例子。1.1.4建模一旦數(shù)據(jù)的準(zhǔn)備完成后,下一階段就是建模了。在這個(gè)階段中,我們將選擇適當(dāng)?shù)乃惴?,并在?shù)據(jù)上訓(xùn)練出一個(gè)模型。在這個(gè)階段,有許多最佳實(shí)踐可以遵循,我們將詳細(xì)討論它們,但是基本的步驟包括將數(shù)據(jù)分割為訓(xùn)練、測(cè)試和驗(yàn)證的集合。這種數(shù)據(jù)的分割可能看上去不合邏輯——尤其是在更多的數(shù)據(jù)通常會(huì)產(chǎn)生更好的模型這種情況下——但正如我們將看到的,這樣做可以讓我們獲得更好的反饋,理解該模型在現(xiàn)實(shí)世界中會(huì)表現(xiàn)得如何,并避免建模的大忌:過擬合。1.1.5評(píng)估一旦模型構(gòu)建完成并開始進(jìn)行預(yù)測(cè),下一步是了解模型做得有多好。這是評(píng)估階段試圖回答的問題。有很多的方式來衡量模型的表現(xiàn),同樣,這在很大程度上依賴于所用數(shù)據(jù)和模型的類型,不過就整體而言,我們?cè)噲D回答這樣的問題:模型的預(yù)測(cè)和實(shí)際值到底有多接近。有一堆聽上去令人混淆的名詞,例如根均方誤差、歐幾里德距離,以及F1得分,但最終,它們還是實(shí)際值與預(yù)估值之間的距離量度。1.1.6部署一旦模型的表現(xiàn)令人滿意,那么下一個(gè)步驟就是部署了。根據(jù)具體的使用情況,這個(gè)階段可能有不同的形式,但常見的場(chǎng)景包括將其作為另一個(gè)大型應(yīng)用程序中的某個(gè)功能特性,一個(gè)定制的Web應(yīng)用程序,甚至只是一個(gè)簡單的cron作業(yè)。1.2Python庫和功能現(xiàn)在,我們已經(jīng)對(duì)數(shù)據(jù)科學(xué)工作流的每一步有了初步的理解,下面來看看在每一步中,存在哪些有用的Python庫和功能可供選擇。1.2.1獲取訪問數(shù)據(jù)常見的方式之一是通過REST風(fēng)格的API接口,需要知道的庫是PythonRequest庫(/en/latest/)。它被稱為給人類使用的HTTP,為API的交互提供了一個(gè)整潔和簡單的方式。讓我們來看一個(gè)使用Requests進(jìn)行交互的例子,它從GitHub的API中拉取數(shù)據(jù)。在這里,我們將對(duì)該API進(jìn)行調(diào)用,并請(qǐng)求某個(gè)用戶的starred庫列表。importrequests

r=requests.get(r"/users/acombs/starred")

r.json()

這個(gè)請(qǐng)求將以JSON文檔的形式,返回用戶已經(jīng)標(biāo)記為starred的所有存儲(chǔ)庫以及它們的屬性。圖1-2是上述調(diào)用后輸出結(jié)果的一個(gè)片段。圖1-2Requests庫有數(shù)量驚人的特性——這里無法全部涵蓋,我建議你看看上面提供的鏈接所指向的文檔。1.2.2檢查由于數(shù)據(jù)檢查是機(jī)器學(xué)習(xí)應(yīng)用開發(fā)中關(guān)鍵的一步,我們現(xiàn)在來深入了解幾個(gè)庫,它們將在此項(xiàng)任務(wù)中很好地為我們服務(wù)。1.Jupyter記事本許多庫有助于減輕數(shù)據(jù)檢查過程的工作負(fù)荷。首先是帶有IPython(/)的Jupyter記事本。這是一個(gè)全面的、交互式的計(jì)算環(huán)境,對(duì)于數(shù)據(jù)探索是非常理想的選擇。和大多數(shù)開發(fā)環(huán)境不同,Jupyter記事本是一個(gè)基于Web的前端(相對(duì)于IPython的內(nèi)核而言),被分成單個(gè)的代碼塊或單元。根據(jù)需要,單元可以單獨(dú)運(yùn)行,也可以一次全部運(yùn)行。這使得開發(fā)人員能夠運(yùn)行某個(gè)場(chǎng)景,看到輸出結(jié)果,然后回到代碼,做出調(diào)整,再看看所產(chǎn)生的變化——所有這些都無需離開記事本。圖1-3是在Jupyter記事本中進(jìn)行交互的樣例。圖1-3請(qǐng)注意,我們?cè)谶@里做了一系列的事情,并不僅僅是和IPython的后端進(jìn)行交互,而且也和終端shell進(jìn)行了交互。這個(gè)特定的實(shí)例運(yùn)行了Python3.5的內(nèi)核,但如果你愿意,也可以很容易地運(yùn)行Python2.X的內(nèi)核。在這里,我們已經(jīng)引入了Pythonos庫,并進(jìn)行了一次調(diào)用,找到當(dāng)前的工作目錄(單元#2),你可以看到輸入代碼單元格下方的輸出。然后,我們?cè)趩卧?3中使用os庫改變了這個(gè)目錄,但是在單元#4中停止使用os庫,而是開始使用基于Linux的命令。這是通過在單元前添加!符號(hào)來完成的。在單元#6中可以看到,我們甚至能夠?qū)hell的輸出保存到一個(gè)Python變量(file_two)。這是一個(gè)很棒的功能,使文件操作變成了一項(xiàng)簡單的任務(wù)。現(xiàn)在,讓我們來看看使用該記事本所進(jìn)行的一些簡單的數(shù)據(jù)操作。這也是我們首次介紹另一個(gè)不可或缺的庫:pandas。2.PandasPandas是一個(gè)卓越的數(shù)據(jù)分析工具。根據(jù)Pandas的文檔(/pandas-docs/version/0.17.1/):它有一個(gè)更廣泛的目標(biāo),就是成為任何語言中,最強(qiáng)大和靈活的開源數(shù)據(jù)分析/操作工具。即使它還沒有達(dá)到這個(gè)目標(biāo),也不會(huì)差得太遠(yuǎn)。現(xiàn)在讓我們來看看。importos

importpandasaspd

importrequests

PATH=r'/Users/alexcombs/Desktop/iris/'

r=

requests.get('/ml/machine-learning-databases/iri

s/iris.data')

withopen(PATH+'iris.data','w')asf:

f.write(r.text)

os.chdir(PATH)

df=pd.read_csv(PATH+'iris.data',names=['sepallength','sepalwidth',

'petallength','petalwidth','class'])

df.head()

前面的代碼和屏幕截圖如圖1-4所示,我們已經(jīng)從/ml/datasets/Iris下載了一個(gè)經(jīng)典的機(jī)器學(xué)習(xí)數(shù)據(jù)集:iris.data,并將其寫入iris目錄。這實(shí)際上是一個(gè)CSV文件,通過Pandas,我們進(jìn)行了一個(gè)調(diào)用并讀取了該文件。我們還增加了列名,因?yàn)檫@個(gè)特定的文件缺一個(gè)標(biāo)題行。如果該文件已經(jīng)包含了一個(gè)標(biāo)題行,Pandas會(huì)自動(dòng)解析并反映這一點(diǎn)。和其他CSV庫相比,Pandas將其變?yōu)橐粋€(gè)簡單的操作。圖1-4解析文件只是該庫的一個(gè)小功能。對(duì)適合于單臺(tái)機(jī)器的數(shù)據(jù)集而言,Pandas是個(gè)終極的工具,這有點(diǎn)像Excel。就像流行的電子表格程序,操作的基本單位是表格形式的數(shù)據(jù)列和行。在Pandas的術(shù)語中,數(shù)據(jù)列稱為系列(Series),而表格稱為數(shù)據(jù)框(DateFrame)。使用之前截屏中同樣的iris數(shù)據(jù)框,讓我們來看看幾個(gè)常見的操作。df['sepallength']

前面的代碼生成圖1-5的輸出。圖1-5第一個(gè)操作是通過列名,從數(shù)據(jù)框中選擇某一列。執(zhí)行數(shù)據(jù)切片的另一種方式是使用.ix[row,column]標(biāo)注。讓我們使用下面這個(gè)標(biāo)注,來選擇前兩列和前四行。df.ix[:3,:2]

前面的代碼生成圖1-6的輸出。使用.ix標(biāo)注和Python列表切片的語法,我們能夠選擇該數(shù)據(jù)框中的一小片?,F(xiàn)在,讓我們更進(jìn)一步,使用列表迭代器并只選擇描述width的列。df.ix[:3,[xforxindf.columnsif'width'inx]]

前面的代碼生成圖1-7所示的輸出。圖1-6圖1-7我們?cè)谶@里所做的是創(chuàng)建一個(gè)列表,該列表是所有列的一個(gè)子集。前面的df.columns返回所有列的列表,而我們的迭代使用了一個(gè)條件查詢,只選擇標(biāo)題中含有width字樣的列。顯然,在這種情況下,我們可以很容易地拼寫出希望在列表中出現(xiàn)的列,但是這里展示了處理大規(guī)模數(shù)據(jù)集時(shí)該庫所具有的能力。我們已經(jīng)看到了,如何基于其在數(shù)據(jù)框中的位置,來選擇數(shù)據(jù)的分片,現(xiàn)在來看看另一種選擇數(shù)據(jù)的方法。這次,我們將根據(jù)某些特定的條件,來選擇數(shù)據(jù)的一個(gè)子集。我們首先列出所有可用的唯一類,然后選擇其中之一。df['class'].unique()

前面的代碼生成圖1-8的輸出。圖1-8df[df['class']=='Iris-virginica']

在圖1-9所示最右側(cè)的一列中,我們可以看到數(shù)據(jù)框只包含Iris-virginica類的數(shù)據(jù)。事實(shí)上,選擇之后圖1-11中數(shù)據(jù)框的大小是50行,比圖1-10中原來的150行要小一些。df.count()

df[df['class']=='Iris-virginica'].count()

圖1-9圖1-10圖1-11我們還可以看到,在左側(cè)的索引保留了原始行號(hào)。現(xiàn)在,可以將這些數(shù)據(jù)保存為一個(gè)新的數(shù)據(jù)框并重置索引,如下面的代碼和截圖1-12所示。virginica=df[df['class']=='Iris-virginica'].reset_index(drop=True)

virginica

圖1-12我們通過在某個(gè)列上放置條件來選擇數(shù)據(jù),現(xiàn)在來添加更多的條件。我們將回到初始的數(shù)據(jù)框,并使用兩個(gè)條件選擇數(shù)據(jù)。df[(df['class']=='Iris-virginica')&(df['petalwidth']>2.2)]

上述代碼生成圖1-13的輸出。圖1-13數(shù)據(jù)框現(xiàn)在只包含來自Iris-virginica類、而且花瓣寬度大于2.2的數(shù)據(jù)?,F(xiàn)在,讓我們使用Pandas,從虹膜數(shù)據(jù)集中獲取一些快速的描述性統(tǒng)計(jì)數(shù)據(jù)。df.describe()

上述代碼生成圖1-14的輸出。圖1-14隨著數(shù)據(jù)框的.describe()方法被調(diào)用,我們收到了各相關(guān)列的描述性統(tǒng)計(jì)信息(請(qǐng)注意,類別信息被自動(dòng)刪除了,因?yàn)樗谶@里是不相關(guān)的)。如果想要更為詳細(xì)的信息,還可以傳入自定義的百分比。df.describe(percentiles=[.20,.40,.80,.90,.95])

上述代碼生成圖1-15的輸出。圖1-15接下來,讓我們檢查這些特征之間是否有任何相關(guān)性。這可以通過在數(shù)據(jù)框上調(diào)用.corr()來完成。df.corr()

上述代碼生成圖1-16的輸出。圖1-16默認(rèn)地,系統(tǒng)返回每個(gè)行-列對(duì)中的Pearson相關(guān)系數(shù)。通過傳遞方法的參數(shù),還可以切換到Kendall'stau或Spearman's秩相關(guān)系數(shù)(例如,.corr(method="spearman")或.corr(method="kendall"))。3.可視化目前為止,我們已經(jīng)看到如何選擇數(shù)據(jù)框的某一部分,并從數(shù)據(jù)中獲取匯總的統(tǒng)計(jì)信息,現(xiàn)在讓我們學(xué)習(xí)如何通過可視化的方式來觀測(cè)數(shù)據(jù)。不過首先要回答的問題是,為什么要花費(fèi)心思進(jìn)行可視化的視察呢?來看一個(gè)例子就能明白這是為什么了。表1-1展示了四組不同序列的x值和y值的匯總統(tǒng)計(jì)。表1-1序列的x和y取值x的平均值9y的平均值7.5序列的x樣本方差11序列的y樣本方差4.1x和y之間的相關(guān)性0.816回歸線y=3.00+0.500x基于四組序列擁有相同的匯總統(tǒng)計(jì),我們可能會(huì)認(rèn)為這些系列的可視化看上去也是相似。我們當(dāng)然是錯(cuò)誤的,非常錯(cuò)誤。這四個(gè)序列是安斯庫姆四重奏的一部分,他們被刻意制造出來用于說明可視化數(shù)據(jù)檢查的重要性。每個(gè)序列繪制在圖1-17中。安斯庫姆四重奏的網(wǎng)址:/wiki/Anscombe%27s_quartet。顯然,經(jīng)過可視化的觀察之后,我們不再會(huì)認(rèn)為這些數(shù)據(jù)集是相同的。所以,現(xiàn)在我們能理解可視化的重要性了,下面來看看一對(duì)用于可視化的、很有價(jià)值的Python庫。圖1-17Matplotlib庫我們將要看到的第一個(gè)庫是matplotlib。這是Python繪圖庫的鼻祖了。最初人們創(chuàng)建它是為了仿效MATLAB的繪圖功能,現(xiàn)在它自己已經(jīng)發(fā)展成為特性完善的庫了,并擁有超多的功能。對(duì)于那些沒有MATLAB背景的使用者,可能很難理解所有這些部件是如何共同協(xié)作來創(chuàng)造圖表的。我們將所有的部件拆分為多個(gè)邏輯模塊,便于大家理解都發(fā)生了些什么。在深入理解matplotlib之前,讓我們先設(shè)置Jupyter記事本,以便看清每個(gè)圖像。要做到這一點(diǎn),需要將以下幾行添加到import聲明中。importmatplotlib.pyplotasplt

plt.style.use('ggplot')

%matplotlibinline

importnumpyasnp

第一行引入了matplotlib,第二行將風(fēng)格設(shè)置為近似R中的ggplot庫(這需要matplotlib1.41),第三行設(shè)置插圖,讓它們?cè)谟浭卤局锌梢?,而最后一行引入了numpy。本章稍后,我們將在一些操作中使用numpy?,F(xiàn)在,讓我們使用下面的代碼,在鳶尾花Iris數(shù)據(jù)集上生成第一個(gè)圖:fig,ax=plt.subplots(figsize=(6,4))

ax.hist(df['petalwidth'],color='black');

ax.set_ylabel('Count',fontsize=12)

ax.set_xlabel('Width',fontsize=12)

plt.title('IrisPetalWidth',fontsize=14,y=1.01)

前面的代碼生成圖1-18中的輸出。圖1-18即使是在這個(gè)簡單的例子中,也發(fā)生了很多事情,讓我們來逐行分析。第一行創(chuàng)建了寬度為6英寸和高度為4英寸的一個(gè)插圖。然后,我們通過調(diào)用.hist()并傳入數(shù)據(jù),依照iris數(shù)據(jù)框繪制了花瓣寬度的直方圖。這里還將直方圖中柱子的顏色設(shè)置為black(黑色)。接下來的兩行分別在y軸和x軸上放置標(biāo)簽,最后一行為全圖設(shè)置了標(biāo)題。其中使用y軸的參數(shù)調(diào)整了標(biāo)題在y軸方向相對(duì)于圖片頂部的位置,并微微增加了默認(rèn)字體的大小。這使得我們從花瓣寬度的數(shù)據(jù)得到了一個(gè)很漂亮的直方圖。現(xiàn)在,讓我們進(jìn)一步擴(kuò)展,為iris數(shù)據(jù)集的每一列生成直方圖。fig,ax=plt.subplots(2,2,figsize=(6,4))

ax[0][0].hist(df['petalwidth'],color='black');

ax[0][0].set_ylabel('Count',fontsize=12)

ax[0][0].set_xlabel('Width',fontsize=12)

ax[0][0].set_title('IrisPetalWidth',fontsize=14,y=1.01)

ax[0][1].hist(df['petallength'],color='black');

ax[0][1].set_ylabel('Count',fontsize=12)

ax[0][1].set_xlabel('Lenth',fontsize=12)

ax[0][1].set_title('IrisPetalLenth',fontsize=14,y=1.01)

ax[1][0].hist(df['sepalwidth'],color='black');

ax[1][0].set_ylabel('Count',fontsize=12)

ax[1][0].set_xlabel('Width',fontsize=12)

ax[1][0].set_title('IrisSepalWidth',fontsize=14,y=1.01)

ax[1][1].hist(df['sepallength'],color='black');

ax[1][1].set_ylabel('Count',fontsize=12)

ax[1][1].set_xlabel('Length',fontsize=12)

ax[1][1].set_title('IrisSepalLength',fontsize=14,y=1.01)

plt.tight_layout()

上述代碼的輸出顯示如圖1-19所示。圖1-19顯然,這不是最有效的編碼方法,但是對(duì)于展示matplotlib是如何工作的很有用處。請(qǐng)注意,我們現(xiàn)在是通過ax數(shù)組來繪制四個(gè)子插圖,而不是之前例子中的單一子插圖對(duì)象ax。新增加的代碼是調(diào)用plt.tight_layout(),該方法將很好地自動(dòng)調(diào)整子插圖,以避免排版上顯得過于擁擠?,F(xiàn)在來看看matplotlib所提供的一些其他類型的畫圖模式。一個(gè)有用的類型是散點(diǎn)圖。這里,我們將在x軸和y軸分布繪畫花瓣寬度和花瓣長度。fig,ax=plt.subplots(figsize=(6,6))

ax.scatter(df['petalwidth'],df['petallength'],color='green')

ax.set_xlabel('PetalWidth')

ax.set_ylabel('PetalLength')

ax.set_title('PetalScatterplot')

上述的代碼生成了圖1-20所示的輸出。圖1-20如前所述,我們可以添加多個(gè)子插圖,來檢視每個(gè)方面。我們可以考察的另一種類型是簡單的線圖。這里來看看花瓣長度的插圖。fig,ax=plt.subplots(figsize=(6,6))

ax.plot(df['petallength'],color='blue')

ax.set_xlabel('SpecimenNumber')

ax.set_ylabel('PetalLength')

ax.set_title('PetalLengthPlot')

上述的代碼生成了圖1-21所示的輸出?;谶@個(gè)簡單的線圖,我們已經(jīng)可以看到對(duì)于每個(gè)類別存在鮮明的長度差別——請(qǐng)記住樣本數(shù)據(jù)集在每個(gè)類別擁有50個(gè)排序的樣例。這就告訴我們,花瓣長度很可能是用于區(qū)分類別的一個(gè)有用特征。圖1-21讓我們來看看matplotlib庫中最后一個(gè)類型的圖表:條形圖。這也許是最為常見的圖表之一。這里將使用三類鳶尾花中每個(gè)特征的平均值繪制一個(gè)條形圖,而且為了讓其更有趣,我們將使用堆積條形圖,它附帶了若干新的matplotlib特性。fig,ax=plt.subplots(figsize=(6,6))

bar_width=.8

labels=[xforxindf.columnsif'length'inxor'width'inx]

ver_y=[df[df['class']=='Iris-versicolor'][x].mean()forxinlabels]

vir_y=[df[df['class']=='Iris-virginica'][x].mean()forxinlabels]

set_y=[df[df['class']=='Iris-setosa'][x].mean()forxinlabels]

x=np.arange(len(labels))

ax.bar(x,vir_y,bar_width,bottom=set_y,color='darkgrey')

ax.bar(x,set_y,bar_width,bottom=ver_y,color='white')

ax.bar(x,ver_y,bar_width,color='black')

ax.set_xticks(x+(bar_width/2))

ax.set_xticklabels(labels,rotation=-70,fontsize=12);

ax.set_title('MeanFeatureMeasurementByClass',y=1.01)

ax.legend(['Virginica','Setosa','Versicolor'])

上述的代碼生成圖1-22所示的輸出。圖1-22為了生成條形圖,我們需要將x和y的值傳遞給.bar()方法。在這種情況下,x值將只是我們感興趣的特征的長度的數(shù)組,在這個(gè)例子中是4,或者是數(shù)據(jù)框中列的數(shù)量。函數(shù)np.arange()是產(chǎn)生這個(gè)數(shù)值的簡單方法,但也可以輕松地手動(dòng)輸入這個(gè)數(shù)組。由于我們不想在x軸顯示1到4,因此調(diào)用了.set_xticklabels()方法并傳入想要顯示的列名。為了讓x軸的標(biāo)簽對(duì)齊,我們還需要調(diào)整標(biāo)簽之間的間隔。這就是為什么將xticks設(shè)置為x加上bar_width值的一半,而我們先前已經(jīng)將bar_width設(shè)置為0.8。這里y值來自每個(gè)類別中特征的平均值。然后,通過調(diào)用.bar()繪制每個(gè)插圖。需要注意的是,我們?yōu)槊總€(gè)序列傳入一個(gè)bottom參數(shù),這個(gè)參數(shù)將該序列的y點(diǎn)最小值設(shè)置為其下面那個(gè)序列的y點(diǎn)最大值。這就能創(chuàng)建堆積條形圖。最后,添加了一個(gè)圖例來描述每個(gè)序列。按照從頂部到底部條形放置的順序,我們依次在圖例中插入了相應(yīng)的名稱。Seaborn庫我們接下來將看到的可視化庫被稱為seaborn(/~mwaskom/software/seaborn/index.html)。它是專門為統(tǒng)計(jì)可視化而創(chuàng)建的庫。事實(shí)上,seaborn可以和pandas數(shù)據(jù)框完美地協(xié)作,框中的列是特征而行是觀測(cè)的樣例。這種數(shù)據(jù)框的風(fēng)格被稱為整潔的數(shù)據(jù),而且它是機(jī)器學(xué)習(xí)應(yīng)用中最常見的形式。現(xiàn)在讓我們來看看seaborn的能力。importseabornassns

sns.pairplot(df,hue="class")

僅僅通過這兩行代碼,我們就可以得到圖1-23所示的輸出。圖1-23就在剛剛我們?cè)敿?xì)地討論了matplotlib錯(cuò)綜復(fù)雜的細(xì)微之處,而生成這張圖的簡單性卻顯而易見。僅僅使用了兩行代碼,所有的特征都已經(jīng)被繪畫出來,彼此對(duì)照并標(biāo)上了正確的標(biāo)簽。那么,當(dāng)seaborn使得這種可視化變得如此簡單的時(shí)候,學(xué)習(xí)matplotlib是在浪費(fèi)時(shí)間嗎?幸運(yùn)的是,情況并非如此,seaborn是建立在matplotlib之上的。事實(shí)上,我們可以使用所學(xué)的matplotlib知識(shí)來修改并使用seaborn。讓我們來看看另一個(gè)可視化的例子。fig,ax=plt.subplots(2,2,figsize=(7,7))

sns.set(style='white',palette='muted')

sns.violinplot(x=df['class'],y=df['sepallength'],ax=ax[0,0])

sns.violinplot(x=df['class'],y=df['sepalwidth'],ax=ax[0,1])

sns.violinplot(x=df['class'],y=df['petallength'],ax=ax[1,0])

sns.violinplot(x=df['class'],y=df['petalwidth'],ax=ax[1,1])

fig.suptitle('ViolinPlots',fontsize=16,y=1.03)

foriinax.flat:

plt.setp(i.get_xticklabels(),rotation=-90)

fig.tight_layout()

以上代碼行生成圖1-24所示的輸出。圖1-24這里,我們?yōu)?個(gè)特征分別生成了小提琴圖。小提琴圖顯示了特征的分布情況。例如,我們可以很容易地看到類別irissetosa的花瓣長度高度聚集在1~2厘米之間,而類別iris-virginica分散在4~7厘米之間。我們還可以看到,之前在構(gòu)建matplotlib圖形時(shí)使用了許多相同的代碼。這里主要的區(qū)別在于加入了sns.plot()調(diào)用來取代之前的ax.plot()調(diào)用。我們還使用了fig.suptitle()方法,在所有的子圖上添加了一個(gè)總標(biāo)題,而不是在每個(gè)單獨(dú)的子圖上各自添加標(biāo)題。另一個(gè)明顯的添加部分,是每個(gè)子圖的遍歷取代了之前xticklabels的輪換。我們調(diào)用ax.flat(),遍歷每個(gè)子圖的軸,并使用.setp()設(shè)置特定的屬性。這可以讓我們不再需要像之前matplotlib子圖代碼那樣,單獨(dú)地敲打ax[0][0]…ax[1][1],并設(shè)置屬性。我們?cè)谶@里使用的圖是一個(gè)很好的開始,但是你可以使用matplotlib和seaborn創(chuàng)建上百種不同風(fēng)格的圖形。我強(qiáng)烈建議深入研究這兩個(gè)庫的文檔,這將是非常值得的。1.2.3準(zhǔn)備我們已經(jīng)學(xué)到了很多有關(guān)檢查數(shù)據(jù)的內(nèi)容,現(xiàn)在讓我們開始學(xué)習(xí)如何處理和操作數(shù)據(jù)。這里你將了解pandas的Series.map()、Series.apply()、DataFrame.apply()、DataFrame.applymap()和DataFrame.groupby()方法。這些對(duì)于處理數(shù)據(jù)而言是非常有價(jià)值的,而且在特征工程的機(jī)器學(xué)習(xí)場(chǎng)景下特別有用,我們將在后面的章節(jié)詳細(xì)地討論這個(gè)概念。1.MapMap方法適用于序列數(shù)據(jù),所以在我們的例子中將用它來轉(zhuǎn)變數(shù)據(jù)框的某個(gè)列,它就是一個(gè)pandas的序列。假設(shè)我們覺得類別的名字太長了,并且希望使用特殊的3字母代碼系統(tǒng)對(duì)其進(jìn)行編碼。為了實(shí)現(xiàn)這點(diǎn),我們將使用map方法并將一個(gè)Python字典作為其參數(shù)。這里將為每個(gè)單獨(dú)的鳶尾花類型傳入替換的文本。df['class']=df['class'].map({'Iris-setosa':'SET','Iris-virginica':

'VIR','Iris-versicolor':'VER'})

df

前面的代碼生成圖1-25的輸出。圖1-25下面來看看這里做了些什么。我們?cè)诂F(xiàn)有class列的每個(gè)值上運(yùn)行了map的方法。由于每個(gè)值都能在Python字典中找到,所以它會(huì)被添加到被返回的序列。我們?yōu)榉祷匦蛄匈x予了相同的class名,所以它替換了原有的class列。如果我們選擇了一個(gè)不同的名字,例如shortclass,那么這一列會(huì)被追加到數(shù)據(jù)框,然后我們將有初始的class列外加新的shortclass列。我們還可以向map方法傳入另一個(gè)序列或函數(shù),來執(zhí)行對(duì)某個(gè)列的轉(zhuǎn)變,但這個(gè)功能在apply方法也是可用的,下面這節(jié)會(huì)討論該方法。字典的功能是map方法所獨(dú)有的,這也是選擇map而不是apply進(jìn)行單列轉(zhuǎn)變的最常見原因?,F(xiàn)在讓我們來看看apply方法。2.ApplyApply的方法讓我們既可以在數(shù)據(jù)框上工作,也可以在序列上工作。我們將從一個(gè)也能使用map的例子開始,然后再討論只能使用apply的示例。繼續(xù)使用iris數(shù)據(jù)框,讓我們根據(jù)花瓣的寬度來創(chuàng)建新的列。之前我們看到花瓣寬度的平均值為1.3?,F(xiàn)在,在數(shù)據(jù)框中創(chuàng)建一個(gè)新的列——寬花瓣,它包含一個(gè)基于petalwidth列的二進(jìn)制值。如果花瓣寬度等于或?qū)捰谥兄?,那么我們將其編碼為1,而如果它小于中值,我們將其編碼為0。為了實(shí)現(xiàn)這點(diǎn),這里將在petalwidth這列使用apply方法。df['widepetal']=df['petalwidth'].apply(lambdav:1ifv>=1.3else0)

df

前面的代碼生成圖1-26所示的輸出。圖1-26這里發(fā)生了幾件事情,讓我們一步一步來看。首先,我們?yōu)樗獎(jiǎng)?chuàng)建的列名簡單地使用了列選擇的語法,向數(shù)據(jù)框追加一個(gè)新的列,在這個(gè)例子中是widepetal。我們將這個(gè)新列設(shè)置為apply方法的輸出。這里在petalwidth列上運(yùn)行apply,并返回了widepetal列的相應(yīng)值。Apply方法作用于petalwidth列的每個(gè)值。如果該值大于或等于1.3,函數(shù)返回1;否則,返回0。這種類型的轉(zhuǎn)換在機(jī)器學(xué)習(xí)領(lǐng)域是相當(dāng)普遍的特征工程轉(zhuǎn)變,所以最好熟悉如何執(zhí)行它?,F(xiàn)在讓我們來看看如何在數(shù)據(jù)框上使用apply,而不是在一個(gè)單獨(dú)的序列上?,F(xiàn)在將基于petalarea來創(chuàng)建一個(gè)新的特征。df['petalarea']=df.apply(lambdar:r['petallength']*r['petalwidth'],

axis=1)

df

前面的代碼生成圖1-27的輸出。圖1-27請(qǐng)注意,這里不是在一個(gè)序列上調(diào)用apply,而是在整個(gè)數(shù)據(jù)框上。此外正是由于在整個(gè)數(shù)據(jù)框上調(diào)用了apply,我們傳送了axis=1的參數(shù)來告訴pandas,我們要對(duì)行運(yùn)用函數(shù)。如果傳入了axis=0,那么該函數(shù)將對(duì)列進(jìn)行操作。這里,每列都是被順序地處理,我們選擇將petallength的值和petalwidth的值相乘。得到的序列就將成為數(shù)據(jù)框中的petalarea列。這種能力和靈活性使得pandas成為了數(shù)據(jù)操作不可或缺的工具。3.Applymap我們已經(jīng)學(xué)習(xí)了列的操作,并解釋了如何在行上運(yùn)作,不過,假設(shè)你想對(duì)數(shù)據(jù)框里所有的數(shù)據(jù)單元執(zhí)行一個(gè)函數(shù),那又該怎么辦呢?這時(shí)applymap就是合適的工具了。這里看一個(gè)例子。df.applymap(lambdav:np.log(v)ifisinstance(v,float)elsev)

前面的代碼生成圖1-28的輸出。圖1-28在這里,我們?cè)跀?shù)據(jù)框上調(diào)用了applymap,如果某個(gè)值是float類型的的實(shí)例,那么就會(huì)獲得該值的對(duì)數(shù)(np.log()利用numpy庫返回該值)。這種類型的檢查,可以防止系統(tǒng)返回一個(gè)錯(cuò)誤信息,或者是為字符串型的class列或整數(shù)形的widepetal列返回浮動(dòng)值。Applymap的常見用法是根據(jù)一定的條件標(biāo)準(zhǔn)來轉(zhuǎn)變或格式化每一個(gè)單元。4.Groupby現(xiàn)在,讓我們來看一個(gè)非常有用,但對(duì)于新pandas用戶往往難以理解的操作——數(shù)據(jù)框.groupby()方法。我們將逐步分析若干例子,來展示這個(gè)最為重要的功能。這個(gè)groupby操作就如其名——它基于某些你所選擇的類別對(duì)數(shù)據(jù)進(jìn)行分組。讓我們使用iris數(shù)據(jù)集來看一個(gè)簡單的例子。這里將回到之前的步驟,重新導(dǎo)入最初的iris數(shù)據(jù)集,并運(yùn)行第一個(gè)groupby操作。df.groupby('class').mean()

前面的代碼生成圖1-29所示的輸出。圖1-29系統(tǒng)按照類別對(duì)數(shù)據(jù)進(jìn)行了劃分,并且提供了每個(gè)特征的均值。讓我們現(xiàn)在更進(jìn)一步,得到每個(gè)類別完全的描述性統(tǒng)計(jì)信息。df.groupby('class').describe()

前面的代碼生成圖1-30所示的輸出。圖1-30現(xiàn)在我們可以看到每個(gè)class完整的分解。再來看看其他一些可執(zhí)行的groupby操作。之前,我們看出花瓣長度和寬度在不同類之間有一些比較明顯的區(qū)別,這里讓我們看看如何使用groupby來發(fā)現(xiàn)這一點(diǎn)。df.groupby('petalwidth')['class'].unique().to_frame()

前面的代碼生成圖1-31所示的輸出。在這個(gè)例子中,我們通過和每個(gè)唯一類相關(guān)聯(lián)的花瓣寬度,對(duì)類別進(jìn)行分組。這里測(cè)量組的數(shù)量還是可管理的,但是如果這個(gè)數(shù)量將要增大很多,那么我們很可能需要將測(cè)量分割為不同的范圍。正如之前看到的,這點(diǎn)可以使用apply方法來完成。圖1-31現(xiàn)在來看一個(gè)自定義的聚集函數(shù)。df.groupby('class')['petalwidth']\

.agg({'delta':lambdax:x.max()-x.min(),'max':np.max,'min':np.min})

前面的代碼生成圖1-32所示的輸出。圖1-32在這段代碼中,我們根據(jù)類別來分組花瓣寬度的時(shí)候,使用np.max和np.min這兩個(gè)函數(shù)(兩個(gè)np函數(shù)來自numpy庫),以及返回最大花瓣寬度減去最小花瓣寬度的lambda函數(shù)。這些都以字典的形式,傳遞給.agg()方法,以此返回一個(gè)將字典鍵值作為列名的數(shù)據(jù)框??梢詢H僅運(yùn)行函數(shù)本身或者傳遞函數(shù)的列表,不過列的名稱所含信息量就更少了\h\h[1]。我們只是剛剛接觸了groupby方法的一些功能,還有很多東西要學(xué)習(xí),所以我建議你閱讀這里的文檔:/pandas-docs/stable/。對(duì)于準(zhǔn)備階段中如何操縱和準(zhǔn)備數(shù)據(jù),我們現(xiàn)在有了扎實(shí)的基本理解,而下一步就是建模。這里即將討論P(yáng)ython機(jī)器學(xué)習(xí)生態(tài)系統(tǒng)中最為主要的一些庫。1.2.4建模和評(píng)估對(duì)于統(tǒng)計(jì)建模和機(jī)器學(xué)習(xí),Python有許多很優(yōu)秀的、文檔詳實(shí)的庫供選擇。下面只談及最流行的幾個(gè)庫。1.Statsmodels我們要介紹的第一個(gè)庫是statsmodels(/)。Statsmodels是用于探索數(shù)據(jù)、估計(jì)模型,并運(yùn)行統(tǒng)計(jì)檢驗(yàn)的Python包。在這里,讓我們使用它來構(gòu)建一個(gè)簡單的線性回歸模型,為setosa類中花萼長度和花萼寬度之間的關(guān)系進(jìn)行建模。首先,通過散點(diǎn)圖來目測(cè)這兩者的關(guān)系。fig,ax=plt.subplots(figsize=(7,7))

ax.scatter(df['sepalwidth'][:50],df['sepallength'][:50])

ax.set_ylabel('SepalLength')

ax.set_xlabel('SepalWidth')

ax.set_title('SetosaSepalWidthvs.SepalLength',fontsize=14,

y=1.02)

前面的代碼生成圖1-33所示的輸出。圖1-33我們可以看到,似乎有一個(gè)正向的線性關(guān)系,也就是說,隨著花萼寬度的增加,花萼長度也會(huì)增加。接下來我們使用statsmodels,在這個(gè)數(shù)據(jù)集上運(yùn)行一個(gè)線性回歸模型,來預(yù)估這種關(guān)系的強(qiáng)度。importstatsmodels.apiassm

y=df['sepallength'][:50]

x=df['sepalwidth'][:50]

X=sm.add_constant(x)

results=sm.OLS(y,X).fit()

print(results.summary())

前面的代碼生成圖1-34所示的輸出。圖1-34所示的屏幕截圖顯示了這個(gè)簡單回歸模型的結(jié)果。由于這是一個(gè)線性回歸,該模型的格式為Y=Β0+Β1X,其中B0為截距而B1是回歸系數(shù)。在這里,最終公式是SepalLength=2.6447+0.6909×SepalWidth。我們也可以看到,該模型的R2值是一個(gè)可以接受的0.558,而p值(Prob)是非常顯著的——至少對(duì)于這個(gè)類而言。圖1-34現(xiàn)在讓我們使用結(jié)果對(duì)象來繪制回歸線。fig,ax=plt.subplots(figsize=(7,7))

ax.plot(x,results.fittedvalues,label='regressionline')

ax.scatter(x,y,label='datapoint',color='r')

ax.set_ylabel('SepalLength')

ax.set_xlabel('SepalWidth')

ax.set_title('SetosaSepalWidthvs.SepalLength',fontsize=14,

y=1.02)

ax.legend(loc=2)

前面的代碼生成圖1-35所示的輸出。通過繪制results.fittedvalues,我們可以獲取從模型所得的回歸線。在statsmodels包中,還有一些其他的統(tǒng)計(jì)函數(shù)和測(cè)試模塊,我希望你能去探索它們。對(duì)于Python中標(biāo)準(zhǔn)的統(tǒng)計(jì)建模而言,這是一個(gè)非常有用的包。接下來,讓我們開始學(xué)習(xí)Python機(jī)器學(xué)習(xí)包中的王者:scikit-learn。2.scikit-learnscikit-learn是一個(gè)令人驚喜的Python庫,作者們?yōu)槠湓O(shè)計(jì)了無與倫比的文檔,為幾十個(gè)算法提供了統(tǒng)一的API接口。它建立在Python科學(xué)棧的核心模塊之上,也就是NumPy、SciPy、pandas和matplotlib。scikit-learn覆蓋的一些領(lǐng)域包括:分類、回歸、聚類、降維、模型選擇和預(yù)處理。圖1-35我們來看看幾個(gè)例子。首先,使用iris數(shù)據(jù)建立一個(gè)分類器,然后學(xué)習(xí)如何利用scikit-learn的工具來評(píng)估得到的模型。在scikit-learn中打造機(jī)器學(xué)習(xí)模型的第一步,是理解數(shù)據(jù)應(yīng)該如何構(gòu)建。獨(dú)立變量應(yīng)該是一個(gè)數(shù)字型的n×m維的矩陣X、一個(gè)因變量y和n×1維的向量。該y向量可以是連續(xù)的數(shù)字,也可以是離散的數(shù)字,還可以是離散的字符串類型。然后將這些向量傳遞到指定分類器的.fit()方法。這是使用scikit-learn最大的好處,每個(gè)分類器都盡最大可能地使用同樣的方法。如此一來,它們的交換使用易如反掌。讓我們來看看在第一個(gè)例子中,如何實(shí)現(xiàn)。fromsklearn.ensembleimportRandomForestClassifier

fromsklearn.cross_validationimporttrain_test_split

clf=RandomForestClassifier(max_depth=5,n_estimators=10)

X=df.ix[:,:4]

y=df.ix[:,4]

X_train,X_test,y_train,y_test=train_test_split(X,y,

test_size=.3)

clf.fit(X_train,y_train)

y_pred=clf.predict(X_test)

rf=pd.DataFrame(list(zip(y_pred,y_test)),columns=['predicted',

'actual'])

rf['correct']=rf.apply(lambdar:1ifr['predicted']==

r['actual']else0,axis=1)

rf

前面的代碼生成圖1-36的輸出。圖1-36現(xiàn)在,讓我們來看看下面的代碼。rf['correct'].sum()/rf['correct'].count()

這會(huì)生成圖1-37的輸出。圖1-37在前面的幾行代碼中,我們建立、訓(xùn)練并測(cè)試了一個(gè)分類器,它在Iris數(shù)據(jù)集上具有95%的準(zhǔn)確度。這里逐項(xiàng)分析每個(gè)步驟。在代碼的前兩行,我們做了幾個(gè)導(dǎo)入,前兩個(gè)是從scikit-learn,值得慶幸的是在import語句中其名字縮短為sklearn了。第一個(gè)導(dǎo)入的是一個(gè)隨機(jī)森林分類器,第二個(gè)導(dǎo)入的是一個(gè)將數(shù)據(jù)分成訓(xùn)練組和測(cè)試組的模塊。出于某些原因,這種數(shù)據(jù)切分在機(jī)器學(xué)習(xí)應(yīng)用的構(gòu)建中是很關(guān)鍵的。我們將在以后的章節(jié)討論這些,現(xiàn)在只需要知道這是必需的。模塊train_test_split還會(huì)打亂數(shù)據(jù)的先后順序,這也是非常重要的,因?yàn)樵械捻樞蚩赡馨`導(dǎo)實(shí)際預(yù)測(cè)的信息。在這本書中,我們將使用最新的Python版本,撰寫本書的時(shí)候是版本3.5。如果你使用的Python是版本2.x,你需要添加額外的import語句,讓整數(shù)的除法和Python3.x中的一樣運(yùn)作。沒有這一行,你的準(zhǔn)確度將被報(bào)告為0,而不是95%。該行是:from__future__importdivision

在import語句之后,第一行看上去很奇怪的代碼實(shí)例化了我們的分類器,這個(gè)例子中是隨機(jī)森林分類器。這里選擇一個(gè)使用10個(gè)決策樹的森林,而每棵樹最多允許五層的判定深度。如此實(shí)施的原因是為了避免過擬合(overfitting),我們將在后面的章節(jié)中深入討論這個(gè)話題。接下來的兩行創(chuàng)建了X矩陣和y向量。初始的iris數(shù)據(jù)框包含四個(gè)特征:花瓣的寬度和長度,以及花萼的寬度和長度。這些特征被選中并成為獨(dú)立特征矩陣X。最后一列,iris類別的名稱,就成為了因變的y向量。然后這些被傳遞到train_test_split方法,該方法將數(shù)據(jù)打亂并劃分為四個(gè)子集,X_train,X_test,y_train和y_test。參數(shù)test_size被設(shè)置為0.3,這意味著數(shù)據(jù)集的30%將被分配給X_test和y_test部分,而其余的將被分配到訓(xùn)練的部分,X_train和y_train。接下來,使用訓(xùn)練數(shù)據(jù)來擬合我們的模型。一旦模型訓(xùn)練完畢,再通過測(cè)試數(shù)據(jù)來調(diào)用分類器的預(yù)測(cè)方法。請(qǐng)記住,測(cè)試數(shù)據(jù)是分類器沒有處理過的數(shù)據(jù)。預(yù)測(cè)的返回結(jié)果是預(yù)估標(biāo)簽的列表。然后,我們創(chuàng)建對(duì)應(yīng)實(shí)際標(biāo)簽與預(yù)估標(biāo)簽的數(shù)據(jù)框。最終,我們加和正確的預(yù)測(cè)次數(shù),并將其除以樣例的總數(shù),從而看出預(yù)測(cè)的準(zhǔn)確率。現(xiàn)在讓我們看看哪些特征提供了最佳的辨別力或者說預(yù)測(cè)能力。f_importances=clf.feature_importances_

f_names=df.columns[:4]

f_std=np.std([tree.feature_importances_fortreein

clf.estimators_],axis=0)

zz=zip(f_importances,f_names,f_std)

zzs=sorted(zz,key=lambdax:x[0],reverse=True)

imps=[x[0]forxinzzs]

labels=[x[1]forxinzzs]

errs=[x[2]forxinzzs]

plt.bar(range(len(f_importances)),imps,color="r",yerr=errs,

align="center")

plt.xticks(range(len(f_importances)),labels);

從圖1-38可以看出,正如我們根據(jù)之前可視化分析所作出的預(yù)期,花瓣的長度和寬度對(duì)于區(qū)分iris的類別而言,具有更好的辨別力。不過,這些數(shù)字究竟來自哪里?隨機(jī)森林有一個(gè)名為.feature_importances_的方法,它返回特征在決策樹中劃分葉子節(jié)點(diǎn)的相對(duì)能力。如果一個(gè)特征能夠?qū)⒎纸M一致性地、干凈拆分成不同的類別,那么它將具有很高的特征重要性。這個(gè)數(shù)字的總和將始終為1。也許你注意到,在這里我們已經(jīng)包括了標(biāo)準(zhǔn)差,它將有助于說明每個(gè)特征有多么的一致。這是如此生成的:對(duì)于每個(gè)特征,獲取每10棵決策樹的特征重要性,并計(jì)算標(biāo)準(zhǔn)差。圖1-38現(xiàn)在,讓我們看看另一個(gè)使用scikit-learn的例子?,F(xiàn)在,切換分類器并使用支持向量機(jī)(SVM)。fromsklearn.multiclassimportOneVsRestClassifier

fromsklearn.svmimportSVC

fromsklearn.cross_validationimporttrain_test_split

clf=OneVsRestClassifier(SVC(kernel='linear'))

X=df.ix[:,:4]

y=np.array(df.ix[:,4]).astype(str)

X_train,X_test,y_train,y_test=train_test_split(X,y,

test_size=.3)

clf.fit(X_train,y_train)

y_pred=clf.predict(X_test)

rf=pd.DataFrame(list(zip(y_pred,y_test)),columns=['predicted',

'actual'])

rf['correct']=rf.apply(lambdar:1ifr['predicted']==

r['actual']else0,axis=1)

rf

前面的代碼生成圖1-39的輸出。圖1-39現(xiàn)在,讓我們執(zhí)行下面這行代碼。rf['correct'].sum()/rf['correct'].count()

前面的代碼生成圖1-40的輸出。圖1-40這里,我們將模型切換為支持向量機(jī),而沒有改變代碼的本質(zhì)。唯一的變化是引入了SVM而不是隨機(jī)森林,以及實(shí)例化分類器的那一行代碼(標(biāo)簽y需要一個(gè)小小的格式改變,這是因?yàn)镾VM無法像隨機(jī)森林分類器那樣,將這些標(biāo)簽解釋為NumPy的字符串)。這些僅僅是scikit-learn能力的一小部分,但它應(yīng)該可以說明這個(gè)偉大的工具對(duì)于機(jī)器學(xué)習(xí)應(yīng)用而言強(qiáng)大的功能和力量。還有許多其他的機(jī)器學(xué)習(xí)庫,我們?cè)谶@里沒有機(jī)會(huì)討論,不過會(huì)在后面的章節(jié)中探討,這里我強(qiáng)烈建議,如果你是第一次使用機(jī)器學(xué)習(xí)庫,而又想要一個(gè)強(qiáng)大的通用工具,scikit-learn將是你明智的選擇。1.2.5部署將一個(gè)機(jī)器學(xué)習(xí)模型放入生產(chǎn)環(huán)境時(shí),有許多可用的選項(xiàng)。它基本上取決于應(yīng)用程序的性質(zhì)。部署小到在本地機(jī)器上運(yùn)行cron作業(yè),大到在AmazonEC2實(shí)例上部署全面的實(shí)現(xiàn)。這里不會(huì)深入具體實(shí)施的細(xì)節(jié),不過全書中我們將有機(jī)會(huì)研究不同的部署實(shí)例。1.3設(shè)置機(jī)器學(xué)習(xí)的環(huán)境本章已經(jīng)介紹了一些可以通過pip(Python的包管理器)單獨(dú)安裝的庫。不過,我強(qiáng)烈建議你安裝預(yù)打包的解決方案,例如Continuum'sAnacondaPython發(fā)行版。這是一個(gè)單一的可執(zhí)行程序,包含幾乎所有需要的軟件包和依賴者。而且,因?yàn)檫@個(gè)發(fā)行版是針對(duì)Python科學(xué)棧的用戶,它本質(zhì)上是一個(gè)一勞永逸的解決方案。Anaconda也包括軟件包管理器,使得包的更新變得如此簡單。只需簡單地鍵入condaupdate<package_name>,那么庫就會(huì)被更新到最近的穩(wěn)定版本。1.4小結(jié)在本章中,我們介紹了數(shù)據(jù)科學(xué)/機(jī)器學(xué)習(xí)的工作流程。我們學(xué)習(xí)了如何讓數(shù)據(jù)一步步地通過流水線的每個(gè)階段,從最初的獲取一直到最終的部署。本章還涵蓋了Python科學(xué)棧中最重要的一些功能庫及其關(guān)鍵特性?,F(xiàn)在,我們將利用這方面的知識(shí)和經(jīng)驗(yàn),開始創(chuàng)造獨(dú)特的、有價(jià)值的機(jī)器學(xué)習(xí)應(yīng)用程序。在下一章,你將看到如何運(yùn)用回歸模型來發(fā)現(xiàn)一個(gè)便宜的公寓,讓我們開始吧!\h[1]譯者注:就是將函數(shù)以列表的形式,而不是字典的形式進(jìn)行傳送。這樣就缺乏"delta"、"min"和"max"這樣的鍵值作為列名,自動(dòng)生成的列名就不會(huì)有太多的含義。

第2章構(gòu)建應(yīng)用程序,發(fā)現(xiàn)低價(jià)的公寓在上一章中,我們學(xué)習(xí)了使用數(shù)據(jù)的基本要素。現(xiàn)在,我們將運(yùn)用這些知識(shí),構(gòu)建第一個(gè)機(jī)器學(xué)習(xí)的應(yīng)用程序。我們將從一個(gè)規(guī)模很小,但是非常實(shí)際的例子開始:建立一個(gè)應(yīng)用程序來識(shí)別定價(jià)較低的公寓。如果你曾經(jīng)找過公寓,你就會(huì)明白這個(gè)過程可能是多么令人沮喪。它不僅耗費(fèi)時(shí)間,而且即使當(dāng)你發(fā)現(xiàn)一個(gè)自己喜歡的公寓,你怎么知道它就是合適的公寓?你可能在心里設(shè)定了目標(biāo)預(yù)算和區(qū)域。但是,如果你和我是同一類人,那么你也許愿意做一些權(quán)衡。例如,我住在紐約市,那么靠近地鐵站這樣的便利設(shè)施毫無疑問是一個(gè)很大的加分項(xiàng)。但是,這點(diǎn)到底值多少錢?我是否應(yīng)該拿有電梯的住所和靠近火車站的住所進(jìn)行交換?步行到火車站多少分鐘?抵得過走上樓梯嗎?租房的時(shí)候,有幾十個(gè)這樣的問題需要考慮。那么,如何使用機(jī)器學(xué)習(xí)來幫助我們進(jìn)行決策呢?本章的剩余部分會(huì)探索這一點(diǎn)。我們不能得到所有問題的答案(稍后你會(huì)更清楚其中的原因),不過在本章的結(jié)尾,我們將創(chuàng)建一個(gè)應(yīng)用程序,使得找公寓這個(gè)問題變得稍微簡單一點(diǎn)。我們將在本章討論以下主題。獲取公寓的房源數(shù)據(jù)。檢查和準(zhǔn)備數(shù)據(jù)??梢暬瘮?shù)據(jù)。構(gòu)建回歸模型。預(yù)測(cè)。2.1獲取公寓房源數(shù)據(jù)在20世紀(jì)70年代初,如果你想購買股票,就需要聘請(qǐng)經(jīng)紀(jì)人,他們會(huì)收取你將近1%的固定傭金。如果你想購買一張機(jī)票,你需要聯(lián)系旅行社代理,他們將賺取大約7%的傭金。如果你想出售一間房子,你會(huì)聯(lián)系一個(gè)房地產(chǎn)代理,他們賺取6%的傭金。在2016年,你基本上可以免費(fèi)地做前兩者。而對(duì)于最后一項(xiàng),情況仍然和20世紀(jì)70年代的一樣,保持不變。為什么是這種情況?更重要的是,這些與機(jī)器學(xué)習(xí)有什么關(guān)系?現(xiàn)實(shí)是,這一切都?xì)w結(jié)于數(shù)據(jù),以及誰能夠訪問它。你可能想象著通過API或爬取房地產(chǎn)網(wǎng)站,就能夠很容易地訪問珍貴的地產(chǎn)房源數(shù)據(jù)。你錯(cuò)了,如果你打算遵守這些網(wǎng)站的條款和條件的話。房地產(chǎn)數(shù)據(jù)受到房地產(chǎn)經(jīng)紀(jì)人國家協(xié)會(huì)(NAR)的嚴(yán)格控制,由他們運(yùn)行多項(xiàng)房源服務(wù)(MLS)。這是一種聚合房源數(shù)據(jù)的服務(wù),只有經(jīng)紀(jì)人和代理商可以使用它,而且還需要花費(fèi)巨資。所以,可以想象,他們不太希望任何人都能大量地下載這些數(shù)據(jù)。這是不幸的,因?yàn)殚_放這些數(shù)據(jù)無疑會(huì)催生許多有價(jià)值的消費(fèi)者應(yīng)用程序。對(duì)于占家庭預(yù)算最大比重的購買決策而言,這點(diǎn)看上去尤其重要。話雖如此,也不是完全沒有希望。雖然依據(jù)條款所言,直接從MLS提供商獲取數(shù)據(jù)是被禁止的,但是我們可以利用第三方工具來拉取數(shù)據(jù)?,F(xiàn)在,我們來看一個(gè)有用的工具,它可以幫助我們獲取所需的數(shù)據(jù)。使用import.io抓取房源數(shù)據(jù)有許多優(yōu)秀的、基于Python的庫用于抓取網(wǎng)頁,包括requests、BeautifulSoup和Scrapy。我們將探討其中的一些,后面的章節(jié)還會(huì)討論更多。為了達(dá)到此處的目的,我們將使用免費(fèi)的替代方案:Import.io(http://www.import.io)是一個(gè)免費(fèi)的、基于Web的服務(wù),它會(huì)自動(dòng)抓取網(wǎng)頁。這是一個(gè)很好的選擇,讓我們可以避免從頭開始創(chuàng)建一個(gè)網(wǎng)絡(luò)爬蟲。好在,它為房地產(chǎn)的房源數(shù)據(jù)提供了一個(gè)示例API接口,數(shù)據(jù)來自Z。圖2-1的圖片來自http://www.import.io/examples。在import.io的搜索框中輸入Z,檢索Zillow數(shù)據(jù)的樣例。圖2-1他們所提供的數(shù)據(jù)是有關(guān)舊金山的,不過在我們的例子中將使用紐約。為了更換城市,需要使用我們感興趣的數(shù)據(jù)所在的網(wǎng)址,來替換演示所提供的網(wǎng)址。為了實(shí)現(xiàn)這點(diǎn),我們可以打開一個(gè)單獨(dú)的瀏覽器選項(xiàng)卡,并導(dǎo)航到Z。在那里執(zhí)行一個(gè)公寓搜索。讓我們將公寓搜索限制在曼哈頓地區(qū),價(jià)格在$1500到$3000之間。如圖2-2所示。圖2-2一旦有結(jié)果返回,我們需要從瀏覽器地址欄中復(fù)制Z站點(diǎn)的URL,并將其粘貼到之前選項(xiàng)卡中import.io的提取框中。復(fù)制圖2-2中Z地址欄中的URL。并將其粘貼到import.io的提取框中,如圖2-3所示。圖2-3單擊左上角的提取數(shù)據(jù)(ExtractData)按鈕,你將看到一個(gè)結(jié)果表,只顯示你想要的數(shù)據(jù)?,F(xiàn)在,我們可以通過單擊“下載CSV”(DownloadCSV)按鈕,輕松地下載這些數(shù)據(jù)。彈出的對(duì)話框會(huì)問我們需要下載多少頁,從結(jié)果頁可以看出在Zillow的搜索返回了2640條結(jié)果,我們需要下載106頁來獲得整個(gè)數(shù)據(jù)集。而Import.io僅僅允許我們下載20頁,現(xiàn)在也只能如此了。2.2檢查和準(zhǔn)備數(shù)據(jù)我們現(xiàn)在有一個(gè)包含500套公寓的數(shù)據(jù)集。來看看其中有什么。首先在Jupyter記事本中,使用pandas導(dǎo)入數(shù)據(jù)。importpandasaspd

importre

importnumpyasnp

importmatplotlib.pyplotasplt

plt.style.use('ggplot')

%matplotlibinline

pd.set_option("display.max_columns",30)

pd.set_option("display.max_colwidth",100)

pd.set_option("display.precision",3)

#UsethefilelocationofyourImport.iocsv

CSV_PATH=r"/Users/alexcombs/Downloads/magic.csv"

df=pd.read_csv(CSV_PATH)

df.columns

上述代碼生成圖2-4中的輸出。圖2-4最后一行df.columns為數(shù)據(jù)提供了列標(biāo)題的輸出。此外,讓我們使用df.head().T查看數(shù)據(jù)的某些樣本。在行結(jié)束處的.T語法將轉(zhuǎn)置我們的數(shù)據(jù)框并垂直地顯示它,如圖2-5所示。圖2-5我們已經(jīng)可以看出數(shù)據(jù)有一些缺失值(NaN)。需要多個(gè)操作來標(biāo)準(zhǔn)化此數(shù)據(jù)。數(shù)據(jù)集中的列(或者說是圖2-5中轉(zhuǎn)置后的行)表示了每個(gè)Zillow房源的單項(xiàng)數(shù)據(jù)??雌饋硭坪跤袃煞N類型的房源——一種類型是單個(gè)單元,而另一種類型是多個(gè)單元。這兩種類型可以在圖2-6中看到。圖2-6這兩個(gè)房源對(duì)應(yīng)于在Z上所看到的圖像,如圖2-7所示。圖2-7拆分這些的關(guān)鍵是listingtype_value這個(gè)列頭。我們將數(shù)據(jù)拆分為單一的單元,ApartmentforRent,以及多個(gè)單元,ApartmentsforRent:#multipleunits

mu=df[df['listingtype_value'].str.contains('ApartmentsFor')]

#singleunits

su=df[df['listingtype_value'].str.contains('ApartmentFor')]

現(xiàn)在來看看每種房源類型的數(shù)量。len(mu)

上述代碼生成以下輸出。161

len(su)

上述代碼生成以下輸出。339

由于大多數(shù)房源屬于單一單元的類型,我們現(xiàn)在將從此開始。接下來,我們需要將數(shù)據(jù)格式化為標(biāo)準(zhǔn)結(jié)構(gòu)。例如,至少需要為臥室數(shù)、浴室數(shù)、平方英尺和地址各準(zhǔn)備一列。從之前的觀察中可以發(fā)現(xiàn),我們已經(jīng)有一個(gè)清晰的價(jià)格列,那就是pricelarge_value_prices。幸運(yùn)的是,該列中沒有缺失值,因此我們不會(huì)因?yàn)槿鄙贁?shù)據(jù)而丟失任何的房源。臥室和浴室的數(shù)量以及平方英尺將需要一些解析,因?yàn)樗鼈內(nèi)紨D在單一的列中。讓我們解決這個(gè)問題。先來看一下該列。su['propertyinfo_value']

上述代碼生成如圖2-8所示的輸出。圖2-8看上去,數(shù)據(jù)似乎總是包括臥室和浴室的數(shù)量,偶爾也會(huì)包含例如年份這樣的額外信息。在我們繼續(xù)解析之前,先來檢驗(yàn)一下這個(gè)假設(shè)。#

檢查沒有包含

'bd'

'Studio'

的行數(shù)

len(su[~(su['propertyinfo_value'].str.contains('Studio')\

|su['propertyinfo_value'].str.contains('bd'))])

上述代碼生成以下輸出。0

現(xiàn)在來看看下面幾行代碼。#

檢查沒有包含

'ba'

的行數(shù)

len(su[~(su['propertyinfo_value'].str.contains('ba'))])

上述代碼生成以下輸出。6

看來有幾行缺少浴室數(shù)量的數(shù)據(jù)。出現(xiàn)這種情況的原因有多種,我們可以使用一些方法來解決這個(gè)問題。一種就是填充或插補(bǔ)這些缺失的數(shù)據(jù)點(diǎn)。關(guān)于缺失數(shù)據(jù)的主題很可能討論一整章甚至是一本書,這里我建議投入一些時(shí)間來理解這個(gè)課題,它是建模過程中一個(gè)關(guān)鍵的組成部分。然而,這并非此處討論的主要目的,所以我們將假設(shè)數(shù)據(jù)的缺失是隨機(jī)的,即使刪除這些沒有浴室信息的房源,也不會(huì)使得我們的樣本產(chǎn)生不恰當(dāng)?shù)钠颉?

選擇擁有浴室的房源

\h[1]

no_baths=su[~(su['propertyinfo_value'].str.contains('ba'))]

#

再排除那些缺失了浴室信息的房源

sucln=su[~su.index.isin(no_baths.index)]

現(xiàn)在我們可以繼續(xù)解析臥室和浴室信息:#

使用項(xiàng)目符號(hào)進(jìn)行切分

defparse_info(row):

ifnot'sqft'inrow:

br,ba=row.split('')[:2]

sqft=np.nan

else:

br,ba,sqft=row.split('.')[:3]

returnpd.Series({'Beds':br,'Baths':ba,'Sqft':sqft})

attr=sucln['propertyinfo_value'].apply(parse_info)

attr

上述代碼生成圖2-9的輸出。圖2-9這里我們做了些什么?我們?cè)趐ropertyinfo_value列上運(yùn)行了apply函數(shù)。然后該操作返回一個(gè)數(shù)據(jù)框,其中每個(gè)公寓屬性都會(huì)成為單獨(dú)的列。在最終完成之前,還有幾個(gè)額外的步驟。我們需要在取值中刪除字符串(bd、ba和sqft),并且需要將這個(gè)新的數(shù)據(jù)框和原始的數(shù)據(jù)進(jìn)行連接。讓我們現(xiàn)在就這么做吧。#

在取值中將字符串刪除

attr_cln=attr.applymap(lambdax:x.strip().split('')[0]if

isinstance(x,str)elsenp.nan)

attr_cln

上述代碼生成圖2-10的輸出。圖2-10讓我們來看看下面的代碼

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論