2018年1月23日 星期二

python scikit-learn 決策樹

利用了
kaggle - mushroom
學習使用 scikit-learn



引入必要的套件

import numpy  #數字運算
from sklearn.tree import DecisionTreeRegressor  # 決策樹
from sklearn.preprocessing import LabelEncoder  # 將string 替換成 int
from sklearn.model_selection import train_test_split # 將資料集劃分
from sklearn.externals import joblib  #將 model 儲存下來
from sklearn.metrics import accuracy_score #測試predict 資料正確
import pandas as pd  # 讀取 csv file

讀取資料

data = pd.read_csv("mushrooms.csv")  #讀取資料

將字串資料進行轉換
例:  資料[ 'a' , 'b' , 'c'] -> [1,2,3]


labelencoder = LabelEncoder()
for col in data.columns:
    data[col] = labelencoder.fit_transform(data[col])

將資料分開


y = data['class'].tolist()  # 答案
X = data.iloc[0:,1:].values.tolist() # 運算數值

資料劃分
test_size = 0.2
代表 train 有  80% 資料
test 20%

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

資料訓練

clf = DecisionTreeRegressor(max_depth=10)
clf.fit(X_train,y_train)

predict_y = clf.predict(X_test).round() #資料會在0~1之間 用 round 取得最靠近的整數

訓練測試

print(accuracy_score(y_test , predict_y))

利用 joblib 儲存model

joblib.dump(clf , "clf.plk")  #儲存

clf2 = joblib.load("clf.plk")  #讀取

print(clf2.score(X_test , y_test))  #使用

全程式:
import numpy  #數字運算
from sklearn.tree import DecisionTreeRegressor  # 決策樹
from sklearn.preprocessing import LabelEncoder  # 將string 替換成 int
from sklearn.model_selection import train_test_split # 將資料集劃分
from sklearn.externals import joblib  #將 model 儲存下來
import pandas as pd  # 讀取 csv file

data = pd.read_csv("mushrooms.csv")  #讀取資料

labelencoder = LabelEncoder()
for col in data.columns:
    data[col] = labelencoder.fit_transform(data[col])

y = data['class'].tolist()  # 答案 y
X = data.iloc[0:,1:].values.tolist() # 運算數值

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

clf = DecisionTreeRegressor(max_depth=10)

print(numpy.shape(X_train))
print(numpy.shape(X_test))

clf.fit(X_train,y_train)

predict_y = clf.predict(X_test)
print(clf.score(X_test , y_test))

joblib.dump(clf , "clf.plk")
clf2 = joblib.load("clf.plk")
print(clf2.score(X_test , y_test))

第一次做這種練習
有很多參數都沒去使用

預測做出來幾乎都是 1.0
如果 max_depth 調的低一點
會變得低一些

我也不知道做的對不對

統整學到的方法
pd.read_csv()  讀取 csv
labelencoder.fit_transform()  將字串資料  進行編號
train_test_split()  分拆資料集
DecisionTreeRegressor()  決策樹
clf.fit()  決策樹訓練
clf.predict(X_test)  預測
accuracy_score()  將結果評分
joblib.dump()    將 學習 model 儲存
clf2 = joblib.load()  將學習model 載入

沒有留言:

張貼留言