(案例)机器学习之决策树分类--随机森林分类器

决策树分类

  • 代码思想
    • 读取文本数据
    • 整理样本空间
    • 训练随机森林模型
    • 用已训练的模型进行测试
  • 完整代码

代码思想

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))


你可能感兴趣的:(python,机器学习)