(案例)機器學習之決策樹分類--隨機森林分類器

代碼思想

1.讀取文本數據
2.整理樣本空間,對每一行進行標籤編碼,輸入集與輸出集
3.訓練隨機森林模型(交叉驗證)
4.自定義數據,用已經訓練的模型進行測試

讀取文本數據

import numpy as np
#讀取文本數據並保存
data = []
with open('../__path__' , 'r') as f
	for line in f.readlines():
		data.append(line[:-1].split(','))# line.split(','):按逗號進行拆分,line[:-1]去掉數據集中的/n
data = np.array(data)#轉換數據類型

整理樣本空間

import sklearn.preprocessing as sp  # 預處理

train_x, train_y = [], []#創建訓練集空間
encoders = []# 存儲所有的標籤編碼器,以後使用

for index, row in enumerate(data.T):#遍歷轉置後的數據集,講每一個特徵放在一行,方便標籤編輯。
    encoder = sp.LabelEncoder()# 創建標籤編輯器
    if index < len(data.T) - 1:  # 添加到輸入集
        train_x.append(encoder.fit_transform(row))
    else:  # 添加到輸出集
        # train_y.append(encoder.fit_transform(row))
        train_y = encoder.fit_transform(row)
        print(train_y)
    encoders.append(encoder)#存儲標籤編輯器
   
train_x = np.array(train_x).T#轉置標籤矩陣並轉換類型
train_y = np.array(train_y).T#轉置標籤矩陣並轉換類型

訓練隨機森林模型

import sklearn.ensemble as se  # 隨機森林模型
import sklearn.model_selection as ms  # 交叉驗證

# 訓練隨機森林模型
#創建隨機森林模型,max_depth:最大深度,n_estimators:訓練樹量,random_state:隨機類型
model = se.RandomForestClassifier(
		max_depth=6,n_estimators=200,
		random_state=7)

    #交叉驗證cv:交叉次數,scoring:f1得分
score = ms.cross_val_score(
    model,train_x,train_y,
    cv=5,scoring='f1_weighted')

print(score.mean())

model.fit(train_x,train_y)#進行模型訓練

用已訓練的模型進行測試

data = [
    ['h', 'm', '5m', '4', 'b', 'l', 'u'],
    ['h', 'h', '4', '4', 'm', 'm', 'a'],
    ['l', 'l', '2', '4', 's', 'h', 'g'],
    ['l', 'm', '3', '4', 'm', 'h', 'v']]

data = np.array(data)
test_x, test_y = [], []

for index, row in enumerate(data.T):
    encoder = encoders[index]# 使用之前的編碼器
    # if index < len(data)-1:
    if index < len(data.T) - 1:  # 添加到輸入集
        test_x.append(encoder.transform(row))#不要fit_transform,直接使用transform
    else:  # 添加到輸出集
        # train_y.append(encoder.fit_transform(row))
        test_y = encoder.transform(row)
test_x= np.array(test_x).T
test_y = np.array(test_y).T

pre_test_y = model.predict(test_x)#預測結果
print(encoders[-1].inverse_transform(test_y))
print(encoders[-1].inverse_transform(pre_test_y))

完整代碼

'''
    決策樹分類(小汽車分類,隨機森林分類器)
'''
import numpy as np
import sklearn.preprocessing as sp  # 預處理
import sklearn.ensemble as se  # 隨機森林模型
import sklearn.model_selection as ms  # 交叉驗證

# 讀取文本數據,對每一列進行標籤編碼
data = []
with open('../ml_data/car.txt', 'r') as f:
    for line in f.readlines():
        data.append(line[:-1].split(','))  # line.split(','):按逗號進行拆分,line[:-1]去掉數據集中的/n
# print(data)

data = np.array(data)
# print(data.shape)
# print(data)
# print(data.T)

train_x, train_y = [], []
# 整理樣本空間,輸入集與輸出集
encoders = []# 存儲所有的標籤編碼器,以後用
for index, row in enumerate(data.T):
    encoder = sp.LabelEncoder()# 創建標籤編輯器
    # if index < len(data)-1:
    if index < len(data.T) - 1:  # 添加到輸入集
        train_x.append(encoder.fit_transform(row))
    else:  # 添加到輸出集
        # train_y.append(encoder.fit_transform(row))
        train_y = encoder.fit_transform(row)
        print(train_y)
    encoders.append(encoder)
# print(type(train_x),type(train_y))
# print(train_y)

train_x = np.array(train_x).T
train_y = np.array(train_y).T
# print(train_x.shape, train_y.shape)
# print(train_x[0],train_y[0])

# 訓練隨機森林模型
model = se.RandomForestClassifier(max_depth=6,n_estimators=200,random_state=7)

    #交叉驗證
score = ms.cross_val_score(
    model,train_x,train_y,
    cv=5,scoring='f1_weighted')

print(score.mean())

model.fit(train_x,train_y)

# 自定義測試數據,用已訓練的模型進行測試。
data = [
    ['h', 'm', '5m', '4', 'b', 'l', 'u'],
    ['h', 'h', '4', '4', 'm', 'm', 'a'],
    ['l', 'l', '2', '4', 's', 'h', 'g'],
    ['l', 'm', '3', '4', 'm', 'h', 'v']]
data = np.array(data)
test_x, test_y = [], []
# 整理樣本空間,輸入集與輸出集
for index, row in enumerate(data.T):
    encoder = encoders[index]# 使用之前的編碼器
    # if index < len(data)-1:
    if index < len(data.T) - 1:  # 添加到輸入集
        test_x.append(encoder.transform(row))#不想要fit_transform,直接使用
    else:  # 添加到輸出集
        # train_y.append(encoder.fit_transform(row))
        test_y = encoder.transform(row)
test_x= np.array(test_x).T
test_y = np.array(test_y).T

pre_test_y = model.predict(test_x)#預測結果
print(encoders[-1].inverse_transform(test_y))
print(encoders[-1].inverse_transform(pre_test_y))


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章