AI 模型是什麼,什麼是建模 先講我個人的結論: 模型:是應用過往的資料,預測未來尚未發生的或是不存在的事情 建模:則是利用很多大師提出已被驗證過的演算法以及被驗證過的各種神經網路堆疊架構去組合出的一個能解決問題的框架(函數-我其實不太想說函數,免得又複雜的讓人卻步)   我們去看從簡單的Regression、Logistic Regression、SVM、randomForest、lightgbm、XGBoost,一直到複雜的LSTM、GAN、BERT...,這些偉大的模型,真的才是稱的上數據科學家的人,共同發展出來的框架   對於我們一般企業來說,如何用這些既定的模型,如何調參或者拆掉某一些層再訓練,又或者是模型再串模型(machine learning中的pipeline),這對企業單位的應用可以說是比較實際的問題 ,因為我們不可能像google這樣的公司擁有全世界的龐大資料,也不太可能像google、IBM等公司有用不完的運算資源以及AI科學家(這些人其實太頂尖,也不是真的很多)   我的另一個看法是目前較成熟的AI,主要還是針對一些特定的問題 ,例如:二分類、多分類、影像辦識、語音辨識,而通常解決多分類的模型不太可能解決語音辨識的問題, 很多的問題(我的問題是猜大樂透下期會出那些號碼似乎還沒有好的模型啊:))其實都是用問題去找模型 ,這世界上模型愈來愈多,有沒有一種模型是當我輸入問題,模型就可以告訴我最適合的模型是什麼,並且可以自動調參,據說有人在做這檔事   我只是把走了這麼大一圈的路才得出的結論分享給大家,當然這一圈也沒白走,希望更多的人參與,才會有進步   kaggle上有很多的問題及範例,當大家有這些概念後,可以去看看,我常看有些人為了學AI,學了很深的網路爬文技巧,如果你是要預測股價,或許ok,但是要理解一下 特徵工程 做法,如果不是可以先從kaggle裡面有沒有跟你類似的問題,大家在上面提供的solution作法,這樣學起來比較快 有空的時候可以看一下古典統計、線性代數、導數、偏微分或者上上台大李宏毅教授的線上課程,時不時補充一下數理概念會更好   另外對資料庫概念最好要有摸過,知道什麼是key值,什麼是group by,什麼是join   所謂好的模型,其實就是了...

AI實作前的準備工作-資料檢視以及簡單實作一個例子

 AI實作前的準備工作-資料檢視以及

簡單實作一個例子

先想好我要解決(預測)什麼後=>

要實作一個可用的AI模型,應該怎麼做呢?

 

以下有幾個首先對資料要有一定程度的理解,或是我們說做 

#EDA 

#資料探索分析

整個在建模到上線可用的經驗上,你將會有60%-70%的時間花在處理資料的過程,也因此資料整理十分重要,為什麼這麼重要

就像喝咖啡一樣,咖啡好不好喝,重要的還是豆子,再來烘焙,之後才是沖泡技巧,不是嗎?

 

step 1:資料從哪來???

很多公司都有很多系統,很多資料庫,也有公司有數個不同的資料庫,例如:MSSQL、ORACLE、MySQL...,當然你可以利用 #spider提供的函數庫,把資料拉進來,整理一下,觀察一下,不過這樣的做法,我個人認為不太好,你可以想像,畢竟#spider是拿來建模以及建模前的量化前置處理,把整理資料這件事放進來,不是它的強項,有些暫存處理也會吃掉記憶體,因此在整理資料的過程中,不宜放太多的工在它身上

那要怎麼辦,找一個資料庫,將公司的資料重新導到一個倉儲中,並且自動化更新,例如MSSQL,需要注意的是,這個倉儲不是將系統資料庫原原本本copy過來,在導入倉儲時,就要先進行一道篩選,過濾未來用於AI要用的欄位資料,現在公司用的大部分還是關連式資料庫,因此透過關連將資料倒入倉儲中,倉儲的資料庫,TABEL彼此還是要有關連的key值

資料七七八八進來次後,當然再次檢視跟你分析的問題是不是有可能有關,有沒有關係在第一道篩選時,就要儘可能決定,如果不確定可以先放進來,後面再依建模方式來處理,比如:deep learning比較不會影響效能,但在machine learning就不太適合

step2:了解資料

需要用到的知識

#spider的基本操作

#python關於資料處理的幾個函數庫以及常用的函數,如下

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt

import matplotlib as mpl

import seaborn as sns

==========================================================

from sklearn import metrics

import pickle

from sklearn.model_selection import train_test_split


上面列了幾個我常用的library,大部分都是在處理資料時用的

可以熟悉或是翻一下網路資源,看怎麼用

沒有這些的話,請裝一下,就conda install或pip install一下,一樣網路會告於訴各位如何裝

============================================================

再來如何看資料內容

不用公司的資料來講,我用一個網路的例子來看看怎麼想

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import metrics,ensemble,preprocessing

plt.rcParams['font.sans-serif'] = ['Noto Sans CJK TC'] #用來正常顯示中文標籤,注意字型檔要在系統裡,否則抓預設,有可能還是亂碼

plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號

df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',header=None)

#取網路上的資料來分析玩一下

通常AI拿來預測的結果是一個分類問題,例如:會來還是不會來,會買還是不會買,是一個0與1的問題,當然也可以預測5種顏色會喜歡的顏色是哪一個,這還是一個多分類的問題,

另外一種是連續型問題,例如:今年某區30坪,有電梯,在台北市大安區,馬路上(門牌),距明星中學500公尺,距捷運100公尺,跨公園50公尺,有3個停車場,馬路寬50米,棟距10公尺,有管理員,有人收垃圾,公車站30公尺,市場70公尺,屋齡7年,的房價是100萬(台北應該找不到這樣的房子),請問現有一個這樣的資料(每筆資料或許每個條件都有,或許不一定有,或許資料怪怪的--->這部分有空再跟大家分享如何清洗資料,這部分有太多技巧與概念) 房子要賣,該開多少錢賣,預計可以賣多少?<---這是一個連續性的問題

上面的說法應該大家可以了解,同樣的下面的應用例子,在探討的是分類的問題,我拿到一組新的葡萄酒feature參數,如果有一個品酒師,預測他會將這一個新的葡萄酒歸在哪一個等級,或者你也可以想應該適合放在哪個等級的定價區間比較好?(目前有三個等級)---->這就是你要解的問題

df_wine.iloc[:,0] #玩一下df_wine.iloc[:5]與df_win.loc[:5],會發現有不一樣結果喔,自己試一下找答案

df_wine.head(5)
df_wine.isnull().sum()
df_wine._stat_axis.values.tolist()
df_wine.columns.values.tolist() #沒有欄位名稱時

df_wine.columns = ['Class label','Alcohol','Malic Acid','Ash','Alcalnity of ash',
                   'Magnesium','Total phenois','Flavanoids','Nonflavanoid phenols',
                   'Proanthocyanins','Color intensity','Hue','OD280/OD315 of diluted wines',
                   'Proline'] #我們想給欄位的名稱,用list建一個,每個欄位代表什麼請上網爬一下,不是我們技術要討論的部分

print('Class label',np.unique(df_wine['Class label'])) #Total 3 types of class,講一下在2.x print()是沒有括號的,這句意義是要看這個Class label欄位有多少不同的type,寫過程式的人應該都知道,在應用程式中,相同的下拉選項會放在資料庫表的某一個欄位,其他特徵就自己玩一下了

#在這邊說一下,在應用系統資料庫說的欄位,在AI會說成features(特徵),不要緊張!!!

#有一個概念問題,跟大家聊一下,資料庫常會用一個欄位記錄不同屬性,例如:1代表藍色,2代表紅色,3代表黑色,當我們將該欄位轉進來的時候,如果放進machine learning算的時候會如何???先想一下,等下說明,這一定要了解,不然會很不準

在AI的領域裡,可以拿來運算的大都是數值型資料,而且多數都是float型態,不像資料庫的資料格式這麼多種,切記啊

不過又要在補充一下

####既然要預測買或不買,不就是0與1的型態,怎麼會有float型態,沒錯,這個就是你要猜的結果通常是整數型態####

先往下

#step3:建模

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
pd.set_option('display.max_columns',200) #我拿來調整畫面顯示用的,這行可以不用先執行,先執行下面的df_wine.describe()後,再來執行這行之後,再run 一次df_wine.describe()會不一樣,試一下吧

df_wine.index #看一下筆數
df_wine.describe() #看一下每一個feature的筆數,mean,std,min,25%,50%,75%,max(其實也就是四分位數)
df_wine.iloc[0:3,:] #取一塊資料看一下

#開始做一個最簡單的machine learning,先將資料分為訓練跟測試,資料少有資料少的玩法,多有多的做法,通常企業內的資料多達數千萬到數億筆,要全部10-20年資料都放下去跑嗎?這個不一定喔,我也不認為需要如此

X,y = df_wine.iloc[:,1:].values,df_wine.iloc[:,0].values #這句意義是將資料分成訓練特徵以及目標特徵,也就是從縱向將欄位分出來二個區塊,大家熟悉一下,這個題目,目標欄位剛好在第一欄,好處理,如果不在第一欄,大家想一下怎麼切????,另外請大家在實作時,常常用type()函數,看一下你現在分出來的是什麼物件type,上面大家可以看一下加values與不加values type是什麼.....

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3,random_state = 43) #這句話在做橫向資料的切割,主要把X,y從橫向切出訓練及測試資料,所有資料127筆,測試比例為0.3,也就是70%的資料拿來訓練模型

####講一個實務的概念,通常從資料庫抓進來訓練的資料,多少都會有排序,統計通常講的分佈都是隨機分佈,也就是不要"整株好好"(台語),什麼由小到大,由大到小,都不要,因此函數會把資料打亂,至於為什麼有random_state=43,這件事說穿了,就是要原音重現,因為函數在打亂前,會隨機放一個"種子",然後算出亂序,每次會隨機放一個"種子",如果不固定"種子",每次跑出來的資料,都會可能不同結果,你要如何調參(數)去優化模型呢?,至於43,34,3000隨便~~~

上面做完之後,各位就會明瞭下面的圖了

from sklearn.ensemble import RandomForestClassifier
feat_labels = df_wine.columns[1:]
forest = RandomForestClassifier(n_estimators = 1000,random_state =43,n_jobs =4) #定義執行的物件,執行後的參數會放在這個物件中,這就是我們所謂的 #建模

forest.fit(X_train,y_train) #執行運算

importances  = forest.feature_importances_
indices = np.argsort(importances)[::-1] #排序大一》小,原本argsort是由小排到大,再加[::-1]變成由大小

#我們用了RandomForestClassifier,這是一個弱分類器的用法,一般叫隨機森林,雖然企業目前已廣泛使用的是lightgbm,xgboost,同樣都是分類器,但是精準度還是差很多,至於每一種分類器的概念,請大家上網去學習,這裡不會說明,因為太多要講的,唯一要說的是在大家學了deep learning的應用後,你會發現,這些使用樹狀分類器的邏輯跟deep learning還是有幾分相似的

上面的參數講一下:n_estimators代表要建幾顆樹(估算器)來做預測,多一點無妨,但也別太多,有點已經找到極值,再多也沒意義,浪費時間,n_jobs=4是指要用幾核的CPU來執行,通常CPU內核有很多個,也就是要用幾核來執行,這個小範例,一下就走完了,但在一些大案子,跑起來就不一定了,甚至要用GPU來執行,目前也就先建立一些概念吧

大家不知道有沒有一個疑問?,到底是那些features(特徵欄位)擁有主要的決定分類權,也就是那些權重比較高?,執行一下importances  = forest.feature_importances_吧(最後的底線要留下喔),再用indices = np.argsort(importances)[::-1] ,排個序吧,你會看到答案,不過它會是一個數字欄位代碼,到底是哪個欄位呢?再用下面這個碼跑一下囉

for f in range(X_train.shape[1]):
    print('%2d) %-*s %f' %(f+1,30,feat_labels[f],importances[f])) 

我們剛才不是留了30%的測試資料,怎麼測呢?,剛才也提到參數會放在forest物件中,所以如下,正確率也很簡單,拿測試標籤比一下,比如:30筆測試標籤都猜對了,當然就是100%(1),如果沒全部猜對,就看猜中多少囉,除以總數就好了,其實都有函數代一下就好了

這邊留一個東西,我們想一下,這是一個三分類的問題,那每個分類的正確率有沒有辦法用函數或自建函數算出來呢?

y_pred =forest.predict(X_test)
accuracy = metrics.accuracy_score(y_test,y_pred)
print(accuracy)    
 

#把features重要性畫一下圖吧,給老闆看,有時候畫這個目的是給行銷人員看的,實務上是把重要欄位告訴他們,讓他們在行銷資源分配上分配有所依據

plt.bar(range(X_train.shape[1]),importances,color = 'lightblue',align ='center')
plt.xticks(range(X_train.shape[1]),feat_labels,rotation = 90)
plt.xlim([-0.5,X_train.shape[1]]) #-0.5是第一軸左側到y軸的距離
plt.title(u'已常態處理')
plt.tight_layout()    

好了,先分享到此,其實AI應用說複雜,也可以很複雜,要入門也不難,重要的是觀念問題,實務上如何操作,精神是類似,但有些不一樣之處,比如真的要再確認模型可用性,會將訓練資料與測試資料加在一起,重新跑一下預測,資料的時間序,如何切割拿來訓練測試呢?會不會資料切割錯誤,造成空歡喜一埸,如何用ROC AUC來看曲線,如何預估產值...後面再來討論吧!!! 真的拿來用的時候才是真的實戰,重要的是下手做做看

再聊--

對了

1代表藍色,2代表紅色,3代表黑色,當我們將該欄位轉進來的時候,如果放進machine learning算的時候會如何???這個問題回一下,要用one_hot encoding處理一下,怎麼處理,請各位上網查一下,我只分享一個概念,那就是,如果3代表黑色,那麼3就應該佔比較大的影響力嗎?應該不是吧,3在這裡只是一個代號,不是一個影響值,也許大家有點懵了,下面一個例子

假設有10筆資料,其中1代表藍色,2代表紅色,3代表黑色,當中1有7筆,2有2筆,3有1筆

在10筆資料中的顏色feature中,藍色有7筆,紅色有2筆,藍色只有1筆,顯然藍色交易佔大多數,不是嗎?可是machine learning看到3會認為黑色權重要給高一點,因為是3,怎麼解決??,上面已經說了,請看一下one_hot encoding



 


 



留言

這個網誌中的熱門文章

#AI #python 在公司應用的心得(二):#心態 很重要

#AI #python 在公司應用的心得(一):AI 大概念