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