代碼思想
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))