1. 程式人生 > >一個AI產品(資料探勘)的產生過程

一個AI產品(資料探勘)的產生過程

模型的訓練一般包括以下步驟:

1:資料的輸入:

一般使用pandas庫,他有幾種常用的讀入不同檔案型別的函式:

一般我使用read_csv(File_Path,[params]);(對應的檔案型別為csv檔案,這是資料探勘中的常用檔案格式)

2:資料的預處理:

1):缺失值的處理:

使用方法可以用pandas下的imputing這個方法

但是其實自己根據實際問題(結合業務來進行填充可能要更好一些,如一些特徵,本身他的缺失可能就意味著某種資訊,如房屋資料裡面的泳池,普通家庭可能是沒有泳池的,如果該欄位缺失可能說明該棟房屋本身就沒有泳池)

上面的是本身缺失有意義的情況下:

那麼在沒有意義的情況下,我們又想此條資料保留下來,我們又改如何填充呢:

最好的方式就是根據不同的類別算出一個平均值或者眾數,中位數,來進行填充,

具體該用什麼值進行填充是需要進行實際測試的 ,這也就是資料探勘過程中複雜的地方,但是這只是過程的複雜,並不是邏輯的複雜,

關於問題建模和優化問題的複雜,處理過程的多樣性的複雜,你至少通過時間的積累,慢慢的總結出那種資料的處理方式帶來更好的效果;(這也就是目前AI方向調包俠存在的價值所在,因為這一部分跟業務有特別緊密的聯絡,具體到了更加實際的問題)

至於後面的模型的選擇和優化問題,那是正真更加高階的東西;本人還沒有這方面的能力,鄙人目前也是調包調參俠一名;對別人的演算法原理有一定的瞭解,知道什麼問題該用什麼問題,至於在再別人的模型的基礎上優化出更加好的模型,還需要努力,

說一下模型的優化問題,就拿rnn來舉例把,對於序列化的問題,一開始人是懵逼的,不知道怎麼做,但是這時候大牛出現了,實現了一個rnn的演算法來解決像時間這種序列化的問題;但是隨著使用,rnn的問題又暴露了出來,對於很久之前的序列,rnn無法記住,沒有記憶功能,如NLP(自然語言處理)中的一個問題:

           eg: 今天上午有英語課,所以我應該帶_____書;

很明顯答案是英語書,如果用傳統的rnn模型,由於沒有記憶功能,訓練得到我們答案的正確率不搞,好了,那這個時候我們該怎麼辦呢:

好了大牛又出現了,發明了一個LSTM(Long short term memory)模型,加入了門邏輯單元,有效的解決了對於之前內容的遺忘問題;

2):資料的歸一化(標準化)問題

資料歸一化問題在特徵區間差別太大時需要處理的問題;如房屋的價格特徵:他的值可能最大能達到好幾百萬的程度,但是房屋的另外一個特徵房價數可能只有幾個,這時候就出現了資料值相差太大的問題:

我在用tensorflow做迴歸任務的時候遇到過,歸一化和不歸一化的相差結果確實有一定的差距;

但是看過一篇部落格說,基於平方損失的最小二乘法不需要進行歸一化,但是對於大多數的數值型的迴歸預測,基本使用的損失函式都是最小二乘法,

如果你拿不準,那就都試試之後看哪個效果更好一些;再進行選擇;(畢竟這東西有點玄學,更偏向於實踐,資料探勘過程就是不斷把假設進行測試的過程)

下面是關於一個關於需要進行歸一化演算法的總結:

資料需要歸一化的機器學習演算法
需要歸一化的模型:

        有些模型在各個維度進行不均勻伸縮後,最優解與原來不等價,例如SVM(距離分介面遠的也拉近了,支援向量變多?)。對於這樣的模型,除非本來各維資料的分佈範圍就比較接近,否則必須進行標準化,以免模型引數被分佈範圍較大或較小的資料dominate。
        有些模型在各個維度進行不均勻伸縮後,最優解與原來等價,例如logistic regression(因為θ的大小本來就自學習出不同的feature的重要性吧?)。對於這樣的模型,是否標準化理論上不會改變最優解。但是,由於實際求解往往使用迭代演算法,如果目標函式的形狀太“扁”,迭代演算法可能收斂得很慢甚至不收斂。所以對於具有伸縮不變性的模型,最好也進行資料標準化。

        有些模型/優化方法的效果會強烈地依賴於特徵是否歸一化,如LogisticReg,SVM,NeuralNetwork,SGD等。

不需要歸一化的模型:

    (0/1取值的特徵通常不需要歸一化,歸一化會破壞它的稀疏性。)

    有些模型則不受歸一化影響,如DecisionTree。

    ICA好像不需要歸一化(因為獨立成分如果歸一化了就不獨立了?)。

    基於平方損失的最小二乘法OLS不需要歸一化。
原文:https://blog.csdn.net/pipisorry/article/details/52247379 

關於特徵的歸一化和標準化,pandas裡面都有相應的庫,再pandas.preprocess裡面;

 

3):最重要的一點就是關於異常值的檢測了

異常值的檢測關乎資料的質量問題,我覺得是最重要也是最難的問題的,因為一批資料的異常值往往很難定義,一條資料根據不同的判別方法,也可能表現出不同的效果,而且目前的異常值檢測演算法大多數對於閾值的確定需要自己的判斷:(如基於距離的,基於密度的等)

下面說一下有哪些異常值的檢測演算法:

1)iforest:這是我比較推薦的一種異常值檢測演算法:因為它不需要你人為的設定一個閾值,在實際的測試效果也不錯;

2):基於距離的:KNN演算法

3):基於簡單統計量的,如3σ原則,分位點原則等等;

 

3:特徵工程部分

可以說特徵工程是決定一個訓練好模型好壞的決定性步驟,資料決定了你模型的上線,而模型演算法只是逼近這個上線,有時你提煉出了一個關鍵特徵之後,可能你的精度會有很大的提升:

1):特徵轉換:常用的有log(np.log)變換(可以讓特徵更normal)對於數值型別的迴歸模型,如果越符合正太分佈的標準,那麼模型的精度就會越高;還有box-cox(scipy.state)

2):離散特徵(one_hot編碼,label編碼,)

3):連續特徵:離散化操作:分箱(bin)(有等頻,和等距)

4):對於一些原始看起來並沒有用的特徵,如日期:你可能需要通過特徵衍生的方式將它轉換成有用的特徵,如:距離某一個具有重大時間點的天數這個特徵;

5:特徵組合:

1)如:經緯度特徵,他倆組合起來就可以唯一確定一個點(也就是精確位置了)

2):離散性之間:不同類別之間相互組合

3)連續型的變數之間:加減乘除等;

其實對於一些高階的框架,如tensorflow,他已經將這些方法封裝起來了,詳情的使用方法見:

https://mp.csdn.net/postedit/80933921

做完這些資料的處理之後,是的,我個人覺得這些其實都屬於資料的處理;只是特徵工程顯得更加重要和複雜,更具有研究型,所以從資料資料處理中提出來,當成了一個單個的過程;

4:演算法的選擇

演算法的選擇情況有很多種情況:

1:根據實際的問題可以分為迴歸,分類,聚類前兩者屬於監督學習,聚類問題屬於無監督的學習;

2:更具演算法來分:可以分為機器學習和深度學習:

3:然後根據每一個演算法適用領域又還可以分;;比如CNN多用於影象問題;RNN多用於語音識別問題等

5:引數的調節和bagging思想

由於這些方法有很多的超引數,所以你需要通過調參的方式對你的模型進行調整;對於機器學習而言,GridSearch(網格搜尋是一個不錯的選擇,但是不是說把引數全部放進去就可以了,你需要針對不同演算法的特點,對引數進行分組調參,這裡以xgboost來舉例子:如決策樹中有兩個引數是depth和 min_child_weight(樹的深度和樹的深度,最小孩子權重)這些都是決定樹特性的,還有一些其他的引數;分開調節可以節約計算量,引數過多,如果全都一起調節,可能爬不動;

也可以選擇不同的演算法,把預測結果取平均或者是給定一個權重值進行相乘求和;這就是bagging;

以上就是整個過程了,但是對於一個AI產品而言,是不夠的,最重要的就是資料的獲取,以目前人工智慧的現狀,更多的是基於統計的,也就是資料驅動的產品,需要從網際網路上獲取需要的資料,這就需要爬蟲的知識了,當然也有自身產生資料的生成對抗網路;如棋的對弈過程,他是自生產生資料,你只需要給他一個反饋;

 

總結:

1:其實那些演算法就是一個個數學公式:如:歸一化操作(x-min/x-max)標準化(x-μ)/σ;

2:資料探勘過程就是不斷的重複上面的步驟,直至結果最優;其實對於語音識別和影象識別領域也類似,思路不變,只是具體的處理方式和演算法(也就是數學公式變了)

3:其實人工智慧就是人們不斷把世界“定量”化的過程;所謂的定量化就是任何東西都可以用數字表示,這牽涉到哲學問題;解釋一下,拿雷電來舉例,以往人類不知道電荷的時候,以為是雷神發怒了,這是“定性的”;而知道了電荷之後,用特定符號來表示,這就是“定量”問題;

4:是不是感受到了恐懼?未來的你會不會被人工智慧替代?

別緊張,肯定不會的,情感這個東西,人際交往這些東西是不會被替代的;當然如果真被量化了,那這個時代就真被機器所替代了,anyway,至少我們這一代是看不到的,活在當下才是最好的,不要杞人憂天