English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Principio y método de implementación de Random Forest en Python

Introducción

Quiero obtener las características principales de los datos a través del bosque aleatorio

1Teoría

El bosque aleatorio es un método de aprendizaje de máquina altamente flexible, con un amplio campo de aplicación, desde el marketing hasta el seguro de salud. Puede utilizarse tanto para la modelización de simulación de marketing, como para la estadística de la fuente de clientes, la retención y la pérdida. También se puede utilizar para predecir el riesgo de enfermedades y la susceptibilidad de los pacientes enfermos.

De acuerdo con la forma de generación del aprendiz individual, los métodos de aprendizaje en conjunto actuales se pueden dividir大致 en dos grandes categorías, es decir, los métodos serializados que deben generarse en serie debido a la dependencia fuerte entre los aprendices individuales, y los métodos paralelizados que no tienen dependencia fuerte entre los aprendices individuales y pueden generarse simultáneamente;

前者的代表是Boosting,后者的代表是Bagging和“随机森林”(Random
Forest)

随机森林在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择(即引入随机特征选择)。

简单来说,随机森林就是对决策树的集成,但有两点不同:

(2)特征选取的差异性:每个决策树的n个分类特征是在所有特征中随机选择的(n是一个需要我们自己调整的参数)
随机森林,简单理解, 比如预测salary,就是构建多个决策树job,age,house,然后根据要预测的量的各个特征(teacher,39,suburb)分别在对应决策树的目标值概率(salary<5000,salary>=5000),从而,确定预测量的发生概率(如,预测出P(salary<5000)=0.3).

随机森林是一个可做能够回归和分类。 它具备处理大数据的特性,而且它有助于估计或变量是非常重要的基础数据建模。

参数说明:

最主要的两个参数是n_estimators和max_features。

n_estimators:表示森林里树的个数。理论上是越大越好。但是伴随着就是计算时间的增长。但是并不是取得越大就会越好,预测效果最好的将会出现在合理的树个数。

max_features:随机选择特征集合的子集合,并用来分割节点。子集合的个数越少,方差就会减少的越快,但同时偏差就会增加的越快。根据较好的实践经验。如果是回归问题则:

max_features=n_features,如果是分类问题则max_features=sqrt(n_features)。

如果想获取较好的结果,必须将max_depth=None,同时min_sample_split=1。
同时还要记得进行cross_validated(交叉验证),除此之外记得在random forest中,bootstrap=True。但在extra-trees中,bootstrap=False。

2、随机森林python实现

2.1Demo1

实现随机森林基本功能

#Árbol de decisión de bosque aleatorio
from sklearn.tree import DecisionTreeRegressor 
from sklearn.ensemble import RandomForestRegressor 
import numpy as np 
from sklearn.datasets import load_iris 
iris=load_iris() 
#print iris#iris的4个属性是:萼片宽度 萼片长度 花瓣宽度 花瓣长度 标签是花的种类:setosa versicolour virginica 
print(iris['target'].shape)
rf=RandomForestRegressor()#aquí se utilizan los parámetros de configuración predeterminados 
rf.fit(iris.data[:150],iris.target[:150])#entrenar el modelo 
#seleccionar dos instancias con predicciones diferentes 
instance=iris.data[[100,109] 
print(instance)
rf.predict(instance[[0]])
print('instancia 0 predicción;',rf.predict(instance[[0]]))
print('instancia 1 predicción; ',rf.predict(instance[[1]))
print(iris.target[100], iris.target[109)] 

resultados de ejecución

(150,)
[[ 6.3  3.3  6.   2.5]
 [ 7.2  3.6  6.1  2.5]
instancia 0 predicción; [ 2]
instancia 1 predicción; [ 2]
2 2

2.2 Demo2

3comparación de métodos

#random forest test
from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_blobs
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.tree import DecisionTreeClassifier
X, y = make_blobs(n_samples=10000, n_features=10, centers=100, random_state=0)
clf = DecisionTreeClassifier(max_depth=None, min_samples_split=2, random_state=0)
scores = cross_val_score(clf, X, y)
print(scores.mean())    
clf = RandomForestClassifier(n_estimators=10, max_depth=None, min_samples_split=2, random_state=0)
scores = cross_val_score(clf, X, y)
print(scores.mean())    
clf = ExtraTreesClassifier(n_estimators=10, max_depth=None, min_samples_split=2, random_state=0)
scores = cross_val_score(clf, X, y)
print(scores.mean())

运行结果:

0.979408793821
0.999607843137
0.999898989899

2.3 Demo3-Implementar la selección de características

#Árbol de decisión de bosque aleatorio2
from sklearn.tree import DecisionTreeRegressor 
from sklearn.ensemble import RandomForestRegressor 
import numpy as np 
from sklearn.datasets import load_iris 
iris=load_iris() 
from sklearn.model_selection import cross_val_score, ShuffleSplit 
X = iris["data"] 
Y = iris["target"] 
names = iris["feature_names"] 
rf = RandomForestRegressor() 
scores = [] 
for i in range(X.shape[1]: 
 score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2", 
    cv=ShuffleSplit(len(X), 3, .3)) 
 scores.append((round(np.mean(score), 3), names[i])) 
print(sorted(scores, reverse=True))

运行结果:

[(0.89300000000000002, 'ancho del pétalo (cm)'), (0.82099999999999995, 'longitud del pétalo')]
(cm)'), (0.13, 'longitud del sépalo (cm)'), (-0.79100000000000004, 'ancho del sépalo (cm)')]

2.4 demo4-Árbol de decisión de bosque aleatorio

Quería utilizar el siguiente código para construir un bosque aleatorio de árboles de decisión, pero, el problema es que el programa está ejecutándose y no responde, necesitando ser depurado.

#Árbol de decisión de bosque aleatorio4
#coding:utf-8 
import csv 
from random import semilla 
from random import randrange 
from math import sqrt 
def loadCSV(filename):#Carga de datos, almacenando una línea por vez en una lista 
 dataSet = [] 
 with open(filename, 'r') as file: 
 csvReader = csv.reader(file) 
 for line in csvReader: 
  dataSet.append(line) 
 return dataSet 
# Convertir todas las columnas excepto la columna de etiquetas en tipo float 
def column_to_float(dataSet): 
 featLen = len(dataSet[0]) - 1 
 for data in dataSet: 
 for column in range(featLen): 
  data[column] = float(data[column].strip()) 
# Dividir el conjunto de datos aleatoriamente en N secciones, lo que facilita la validación cruzada, una sección es el conjunto de prueba y las otras cuatro secciones son conjuntos de entrenamiento 
def spiltDataSet(dataSet, n_folds): 
 fold_size = int(len(dataSet) / n_folds) 
 dataSet_copy = list(dataSet) 
 dataSet_spilt = [] 
 for i in range(n_folds): 
 fold = [] 
 while len(fold) < fold_size: # Aquí no se puede usar if, if solo tiene efecto en la primera vez, while ejecuta el bucle hasta que la condición no se cumpla 
  index = randrange(len(dataSet_copy)) 
  fold.append(dataSet_copy.pop(index)) # pop() función se utiliza para eliminar un elemento de una lista (por defecto el último elemento), y devuelve el valor del elemento. 
 dataSet_spilt.append(fold) 
 return dataSet_spilt 
# Construir el subconjunto de datos 
def get_subsample(dataSet, ratio): 
 subdataSet = [] 
 lenSubdata = round(len(dataSet) * ratio)# Devuelve un número de punto flotante 
 while len(subdataSet) < lenSubdata: 
 index = randrange(len(dataSet) - 1) 
 subdataSet.append(dataSet[index]) 
 # print len(subdataSet) 
 return subdataSet 
# Separar el conjunto de datos 
def data_spilt(dataSet, index, value): 
 left = [] 
 right = [] 
 for row in dataSet: 
 if row[index] < value: 
  left.append(row) 
 else: 
  right.append(row) 
 devolver(izquierda, derecha) 
# Calcular el costo de división 
def spilt_loss(left, right, class_values): 
 loss = 0.0 
 for class_value in class_values: 
 left_size = len(left) 
 if left_size != 0: # Prevenir la división por cero 
  prop = [row[-1] for row in left].count(class_value) / float(left_size) 
  loss += (prop * (1.0 - prop)) 
 right_size = len(right) 
 if right_size != 0: 
  prop = [row[-1] for row in right].count(class_value) / float(right_size) 
  loss += (prop * (1.0 - prop)) 
 return loss 
# Seleccionar n características aleatorias, entre estas características seleccionar la mejor característica para la división 
def get_best_spilt(dataSet, n_features): 
 features = [] 
 class_values = list(set(row[-1for row in dataSet): 
 b_index, b_value, b_loss, b_left, b_right = 999, 999, 999, None, None 
 while len(features) < n_features: 
 index = randrange(len(dataSet[0])) - 1) 
 if index not in features: 
  features.append(index) 
 # print 'features:', features 
 for index in features: # Encontrar el índice más adecuado para el nodo (menor pérdida) 
 for row in dataSet: 
  left, right = data_spilt(dataSet, index, row[index]) # Ramas izquierda y derecha del nodo 
  loss = spilt_loss(left, right, class_values) 
  if loss < b_loss: # Buscar el costo de división más pequeño 
  b_index, b_value, b_loss, b_left, b_right = index, row[index], loss, left, right 
 # print b_loss 
 # print type(b_index) 
 return {'index': b_index, 'value': b_value, 'left': b_left, 'right': b_right} 
# Determinar la etiqueta de salida 
def decide_label(data): 
 output = [row[-1] for row in data] 
 return max(set(output), key=output.count) 
# Subdividir, el proceso continuo de construcción de nodos hoja 
def sub_spilt(root, n_features, max_depth, min_size, depth): 
 left = root['left'] 
 # print left 
 right = root['right'] 
 del (root['left']) 
 del (root['right']) 
 # print depth 
 if not left or not right: 
 root['left'] = root['right'] = decide_label(left + right) 
 # print 'testing' 
 return 
 if depth > max_depth: 
 root['left'] = decide_label(left) 
 root['right'] = decide_label(right) 
 return 
 if len(left) < min_size: 
 root['left'] = decide_label(left) 
 else: 
 root['left'] = get_best_spilt(left, n_features) 
 # print 'testing_left' 
 sub_spilt(root['left'], n_features, max_depth, min_size, depth + 1) 
 if len(right) < min_size: 
 root['right'] = decide_label(right) 
 else: 
 root['right'] = get_best_spilt(right, n_features) 
 # print 'testing_right' 
 sub_spilt(root['right'], n_features, max_depth, min_size, depth + 1) 
 # Construir el árbol de decisión 
def build_tree(dataSet, n_features, max_depth, min_size): 
 root = get_best_spilt(dataSet, n_features) 
 sub_spilt(root, n_features, max_depth, min_size, 1) 
 return root 
# 预测测试集结果 
def predict(tree, row): 
 predictions = [] 
 if row[tree['index']] < tree['value']: 
 if isinstance(tree['left'], dict): 
  return predict(tree['left'], row) 
 else: 
  return tree['left'] 
 else: 
 if isinstance(tree['right'], dict): 
  return predict(tree['right'], row) 
 else: 
  return tree['right'] 
  # predictions=set(predictions) 
def bagging_predict(trees, row): 
 predictions = [predict(tree, row) for tree in trees] 
 return max(set(predictions), key=predictions.count) 
# 创建随机森林 
def random_forest(train, test, ratio, n_feature, max_depth, min_size, n_trees): 
 trees = [] 
 for i in range(n_trees): 
 train = get_subsample(train, ratio)#从切割的数据集中选取子集 
 tree = build_tree(train, n_features, max_depth, min_size) 
 # print 'tree %d: '%i,tree 
 trees.append(tree) 
 # predict_values = [predict(trees,row) for row in test] 
 predict_values = [bagging_predict(trees, row) for row in test] 
 return predict_values 
# Calcular precisión 
def accuracy(predict_values, actual): 
 correct = 0 
 for i in range(len(actual)): 
 if actual[i] == predict_values[i]: 
  correct += 1 
 return correct / float(len(actual)) 
if __name__ == '__main__': 
 semilla(1) 
 dataSet = loadCSV(r'G:\0Estudiante\tianchiCompetition\miniSample2.csv') 
 column_to_float(dataSet) 
 n_folds = 5 
 profundidad_max = 15 
 tamano_min = 1 
 ratio = 1.0 
 # n_features=sqrt(len(dataSet)-1) 
 n_features = 15 
 n_trees = 10 
 folds = spiltDataSet(dataSet, n_folds)# Primero cortar el conjunto de datos 
 scores = [] 
 para división en divisiones: 
 train_set = folds[ 
   :] # Aquí no se puede usar simplemente train_set=folds, ya que esto sería una referencia, por lo que cuando cambia el valor de train_set, también cambia el valor de folds. Por lo tanto, se debe usar una copia de forma.(L[:]).copy() puede copiar una secuencia, D.copy() puede copiar un diccionario, list puede generar una copia list(L) 
 train_set.remove(fold)# Seleccionar el conjunto de entrenamiento 
 # print len(folds) 
 train_set = sum(train_set, []) # Combinar múltiples listas de folds en una lista de train_set 
 # print len(train_set) 
 test_set = [] 
 para fila en división: 
  row_copy = lista(row) 
  row_copy[-1] = None 
  conjunto_de_pruebas.append(row_copy) 
  # for row in test_set: 
  # print row[-1] 
 actual = [fila[-1] para fila en división] 
 predict_values = random_forest(train_set, test_set, ratio, n_features, max_depth, min_size, n_trees) 
 accur = accuracy(predict_values, actual) 
 scores.append(accur) 
 print ('Árboles es %d' % n_trees) 
 print ('puntuaciones:%s' % scores) 
 print ('puntuación media:%s' % (sum(scores)) / float(len(puntuaciones))) 

2.5 Clasificación de bosque aleatorio de datos de sonido

# CART en el conjunto de datos de notas bancarias
from random import semilla
from random import randrange
from csv import reader
# Load a CSV file
def load_csv(filename):
 file = open(filename, "r")
 lines = reader(file)
 dataset = list(lines)
 return dataset
# Convert string column to float
def str_column_to_float(dataset, column):
 for row in dataset:
 row[column] = float(row[column].strip())
# Dividir un conjunto de datos en k pliegues
def cross_validation_split(dataset, n_folds):
 dataset_dividido = lista()
 dataset_copy = list(dataset)
 fold_size = int(len(dataset) / n_folds)
 for i in range(n_folds):
 fold = list()
 while len(fold) < fold_size:
  index = randrange(len(dataset_copy))
  fold.append(copia_dataset.pop(indice))
 dataset_split.append(fold)
 return dataset_split
# Calcular el porcentaje de precisión
def accuracy_metric(actual, predicted):
 correct = 0
 for i in range(len(actual)):
 if actual[i] == predicted[i]:
  correct += 1
 return correct / float(len(actual)) * 100.0
# Evaluar un algoritmo utilizando una división de validación cruzada
def evaluar_algoritmo(dataset, algoritmo, n_divisiones, *args):
 divisiones = división_cruzada_split(dataset, n_divisiones)
 puntuaciones = lista()
 para división en divisiones:
 conjunto_de_entrenamiento = lista(divisiones)
 conjunto_de_entrenamiento.remove(división)
 conjunto_de_entrenamiento = suma(conjunto_de_entrenamiento, [])
 conjunto_de_pruebas = lista()
 para fila en división:
  row_copy = lista(row)
  conjunto_de_pruebas.append(row_copy)
  row_copy[-1] = None
 predicted = algoritmo(conjunto_de_entrenamiento, conjunto_de_pruebas, *args)
 actual = [fila[-1] para fila en división]
 accuracy = accuracy_metric(actual, predicted)
 puntuaciones.append(accuracy)
 devolver puntuaciones
# Dividir un conjunto de datos basado en un atributo y un valor de atributo
def test_split(index, value, dataset):
 izquierda, derecha = lista(), lista()
 for row in dataset:
 if row[index] < value:
  left.append(row)
 else:
  right.append(row)
 devolver(izquierda, derecha)
# Calculate the Gini index for a split dataset
def gini_index(groups, class_values):
 gini = 0.0
 for class_value in class_values:
 for group in groups:
  size = len(group)
  if size == 0:
  continue
  proportion = [row[-1] for row in group].count(class_value) / float(size)
  gini += (proportion * (1.0 - proportion))
 return gini
# Select the best split point for a dataset
def get_split(dataset):
 class_values = list(set(row[-1] for row in dataset))
 b_index, b_value, b_score, b_groups = 999, 999, 999, None
 for index in range(len(dataset[0]))-1)
 for row in dataset:
  groups = test_split(index, row[index], dataset)
  gini = gini_index(groups, class_values)
  if gini < b_score:
  b_index, b_value, b_score, b_groups = index, row[index], gini, groups
 print ({'indice':b_index, 'valor':b_value})
 return {'index':b_index, 'value':b_value, 'groups':b_groups}
# Crear un nodo terminal de valor
def a_terminal(grupo):
 resultados = [fila[-1] para fila en grupo]
 devolver(max(set(resultados), clave=lambda x: resultados.count(x)))
# Create child splits for a node or make terminal
def split(node, max_depth, min_size, depth):
 left, right = node['groups']
 del(node['groups'])
 # check for a no split
 if not left or not right:
 node['left'] = node['right'] = to_terminal(left + right)
 return
 # check for max depth
 if depth >= max_depth:
 node['left'], node['right'] = to_terminal(left), to_terminal(right)
 return
 # process left child
 if len(left) <= min_size:
 node['left'] = to_terminal(left)
 else:
 node['left'] = get_split(left)
 split(node['left'], max_depth, min_size, depth+1)
 # process right child
 if len(right) <= min_size:
 node['right'] = to_terminal(right)
 else:
 node['right'] = get_split(right)
 split(node['right'], max_depth, min_size, depth+1)
# Construir un árbol de decisiones
def build_tree(train, max_depth, min_size):
 root = get_split(train)
 split(root, max_depth, min_size, 1)
 return root
# Hacer una predicción con un árbol de decisiones
def predict(node, row):
 si fila[node['indice']] < node['valor']:
 si isinstance(node['izquierda'], dict):
  return predict(node['left'], row)
 else:
  return node['left']
 else:
 if isinstance(node['right'], dict):
  return predict(node['right'], row)
 else:
  return node['right']
# Algoritmo de Árbol de Clasificación y Regresión
def arbol_decision(entrenamiento, prueba, profundidad_max, tamano_min):
 arbol = construir_arbol(entrenamiento, profundidad_max, tamano_min)
 predictions = list()
 para fila en prueba:
 prediction = predict(tree, row)
 predictions.append(prediction)
 devolver(predicciones)
# Test CART en el conjunto de datos de notas bancarias
semilla(1)
# cargar y preparar datos
filename = r'G:\0pythonstudy\决策树\sonar.all-data.csv'
dataset = cargar_csv(nom_archivo)
# convert string attributes to integers
for i in range(len(dataset[0]))-1)
 str_column_to_float(dataset, i)
# evaluar algoritmo
n_folds = 5
profundidad_max = 5
tamano_min = 10
puntuaciones = evaluar_algoritmo(dataset, arbol_decision, n_folds, profundidad_max, tamano_min)
print('Puntuaciones: %s' % puntuaciones)
print('Precisión Media: %.3f%%' % (sum(puntuaciones)/float(len(puntuaciones)))

运行结果:

{'index': 38, 'value': 0.0894}
{'index': 36, 'value': 0.8459}
{'index': 50, 'value': 0.0024}
{'index': 15, 'value': 0.0906}
{'index': 16, 'value': 0.9819}
{'index': 10, 'value': 0.0785}
{'index': 16, 'value': 0.0886}
{'index': 38, 'value': 0.0621}
{'index': 5, 'value': 0.0226}
{'index': 8, 'value': 0.0368}
{'index': 11, 'value': 0.0754}
{'index': 0, 'value': 0.0239}
{'index': 8, 'value': 0.0368}
{'index': 29, 'value': 0.1671}
{'index': 46, 'value': 0.0237}
{'index': 38, 'value': 0.0621}
{'index': 14, 'value': 0.0668}
{'index': 4, 'value': 0.0167}
{'index': 37, 'value': 0.0836}
{'index': 12, 'value': 0.0616}
{'index': 7, 'value': 0.0333}
{'index': 33, 'value': 0.8741}
{'index': 16, 'value': 0.0886}
{'index': 8, 'value': 0.0368}
{'index': 33, 'value': 0.0798}
{'index': 44, 'value': 0.0298}
Scores: [48.78048780487805, 70.73170731707317, 58.536585365853654, 51.2195121951
2195, 39.02439024390244]
Mean Accuracy: 53.659%
请按任意键继续. . .

知识点:

1.load CSV file

from csv import reader
# Load a CSV file
def load_csv(filename):
 file = open(filename, "r")
 lines = reader(file)
 dataset = list(lines)
 return dataset
filename = r'G:\0pythonstudy\决策树\sonar.all-data.csv'
dataset=load_csv(filename)
print(dataset)

2.把数据转化成float格式

# Convert string column to float
def str_column_to_float(dataset, column):
 for row in dataset:
 row[column] = float(row[column].strip())
 # print(row[column])
# convert string attributes to integers
for i in range(len(dataset[0]))-1)
 str_column_to_float(dataset, i)

3.把最后一列的分类字符串转化成0、1整数

def str_column_to_int(dataset, column):
 class_values = [row[column] for row in dataset]#生成一个class label的list
 # print(class_values)
 unique = set(class_values)#set 获得list的不同元素
 print(unique)
 lookup = dict()#定义一个字典
 # print(enumerate(unique))
 for i, value in enumerate(unique):
 lookup[value] = i
 # print(lookup)
 for row in dataset:
 row[column] = lookup[row[column]]
 print(lookup['M'])

4、Dividir el conjunto de datos en K partes

# Dividir un conjunto de datos en k pliegues
def cross_validation_split(dataset, n_folds):
 dataset_split = list()# Generar lista vacía
 dataset_copy = list(dataset)
 print(len(dataset_copy))
 print(len(dataset))
 #print(dataset_copy)
 fold_size = int(len(dataset) / n_folds)
 for i in range(n_folds):
 fold = list()
 while len(fold) < fold_size:
  index = randrange(len(dataset_copy))
  # print(index)
  fold.append(dataset_copy.pop(index))# Utilizar .pop() para eliminar todos los elementos dentro (equivalente a transferir), estos k elementos son diferentes.
 dataset_split.append(fold)
 return dataset_split
n_folds=5 
folds = cross_validation_split(dataset, n_folds)#k elementos de entrenamiento diferentes en cada conjunto

5. Calcular la tasa de precisión

# Calcular el porcentaje de precisión
def accuracy_metric(actual, predicted):
 correct = 0
 for i in range(len(actual)):
 if actual[i] == predicted[i]:
  correct += 1
 return correct / float(len(actual)) * 100.0# Esta es la expresión de precisión de clasificación binaria

6. Cada columna en la clasificación bicausada

# Dividir un conjunto de datos basado en un atributo y un valor de atributo
def test_split(index, value, dataset):
 left, right = list(), list()# Initialize two empty lists
 for row in dataset:
 if row[index] < value:
  left.append(row)
 else:
  right.append(row)
 return left, right # Return two lists, each of which performs binary classification of specified rows (index) based on value.

7. Use the Gini coefficient to obtain the best split point

# Calculate the Gini index for a split dataset
def gini_index(groups, class_values):
 gini = 0.0
 for class_value in class_values:
 for group in groups:
  size = len(group)
  if size == 0:
  continue
  proportion = [row[-1] for row in group].count(class_value) / float(size)
  gini += (proportion * (1.0 - proportion))
 return gini
# Select the best split point for a dataset
def get_split(dataset):
 class_values = list(set(row[-1] for row in dataset))
 b_index, b_value, b_score, b_groups = 999, 999, 999, None
 for index in range(len(dataset[0]))-1)
 for row in dataset:
  groups = test_split(index, row[index], dataset)
  gini = gini_index(groups, class_values)
  if gini < b_score:
  b_index, b_value, b_score, b_groups = index, row[index], gini, groups
 # print(groups)
 print ({'index':b_index, 'value':b_value,'score':gini})
 return {'index':b_index, 'value':b_value, 'groups':b_groups}

Este código, al calcular el índice de gini, aplica directamente la fórmula definida, lo que es fácil de entender. Obtener el mejor punto de división puede ser difícil de entender, aquí se utiliza dos capas de iteración, una para las diferentes columnas y otra para las diferentes filas. Y en cada iteración, se actualiza el coeficiente de gini.

8、决策树生成

# Create child splits for a node or make terminal
def split(node, max_depth, min_size, depth):
 left, right = node['groups']
 del(node['groups'])
 # check for a no split
 if not left or not right:
 node['left'] = node['right'] = to_terminal(left + right)
 return
 # check for max depth
 if depth >= max_depth:
 node['left'], node['right'] = to_terminal(left), to_terminal(right)
 return
 # process left child
 if len(left) <= min_size:
 node['left'] = to_terminal(left)
 else:
 node['left'] = get_split(left)
 split(node['left'], max_depth, min_size, depth+1)
 # process right child
 if len(right) <= min_size:
 node['right'] = to_terminal(right)
 else:
 node['right'] = get_split(right)
 split(node['right'], max_depth, min_size, depth+1)

Aquí se utiliza programación recursiva, generando continuamente el árbol izquierdo y el derecho.

9.Construir el árbol de decisiones

# Construir un árbol de decisiones
def build_tree(train, max_depth, min_size):
 root = get_split(train)
 split(root, max_depth, min_size, 1)
 return root 
tree=build_tree(train_set, max_depth, min_size)
print(tree)

10、predecir el conjunto de prueba

# Construir un árbol de decisiones
def build_tree(train, max_depth, min_size):
 root = get_split(train)# Obtener el mejor punto de división, valor de índice, grupos
 split(root, max_depth, min_size, 1)
 return root 
# tree=build_tree(train_set, max_depth, min_size)
# print(tree) 
# Hacer una predicción con un árbol de decisiones
def predict(node, row):
 print(row[node['index']])
 print(node['value'])
 if row[node['index']] < node['value']:# Usar el conjunto de prueba para reemplazar el mejor punto de división entrenado, cuando hay desviación en el punto de división, comparar adicionalmente mediante la búsqueda en los árboles izquierdo y derecho.
 if isinstance(node['left'], dict):# Si es del tipo diccionario, ejecutar la operación
  return predict(node['left'], row)
 else:
  return node['left']
 else:
 if isinstance(node['right'], dict):
  return predict(node['right'], row)
 else:
  return node['right']
tree = build_tree(train_set, max_depth, min_size)
predictions = list()
for row in test_set:
 prediction = predict(tree, row)
 predictions.append(prediction)

11.Evaluar el árbol de decisiones

# Evaluar un algoritmo utilizando una división de validación cruzada
def evaluar_algoritmo(dataset, algoritmo, n_divisiones, *args):
 divisiones = división_cruzada_split(dataset, n_divisiones)
 puntuaciones = lista()
 para división en divisiones:
 conjunto_de_entrenamiento = lista(divisiones)
 conjunto_de_entrenamiento.remove(división)
 conjunto_de_entrenamiento = suma(conjunto_de_entrenamiento, [])
 conjunto_de_pruebas = lista()
 para fila en división:
  row_copy = lista(row)
  conjunto_de_pruebas.append(row_copy)
  row_copy[-1] = None
 predicted = algoritmo(conjunto_de_entrenamiento, conjunto_de_pruebas, *args)
 actual = [fila[-1] para fila en división]
 accuracy = accuracy_metric(actual, predicted)
 puntuaciones.append(accuracy)
 devolver puntuaciones 

Esto es todo el contenido del artículo, espero que sea útil para su aprendizaje y que todos los demás lo apoyen en el tutorial de clamor.

Declaración: El contenido de este artículo se obtiene de la red, el copyright pertenece al autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio web no posee derechos de propiedad, no se ha realizado tratamiento editorial humano y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#w3Declaración: El contenido de este artículo se obtiene de la red, el copyright pertenece al autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio web no posee derechos de propiedad, no se ha realizado tratamiento editorial humano y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#w

Te gustará