Este artículo ha participado en el evento "Ceremonia de Creación de Nuevos Talentos"
Comparación de árboles de decisión ordinarios y bosques aleatorios
Generar conjunto de datos de círculos
X,y = datasets.make_moons(n_samples=500,noise=0.3,random_state=42)
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()
复制代码
función de dibujo
def plot_decision_boundary(model, X, y):
x0_min, x0_max = X[:,0].min()-1, X[:,0].max()+1
x1_min, x1_max = X[:,1].min()-1, X[:,1].max()+1
x0, x1 = np.meshgrid(np.linspace(x0_min, x0_max, 100), np.linspace(x1_min, x1_max, 100))
Z = model.predict(np.c_[x0.ravel(), x1.ravel()])
Z = Z.reshape(x0.shape)
plt.contourf(x0, x1, Z, cmap=plt.cm.Spectral)
plt.ylabel('x1')
plt.xlabel('x0')
plt.scatter(X[:, 0], X[:, 1], c=np.squeeze(y))
plt.show()
复制代码
Predicción usando árboles de decisión
Cree un árbol de decisión y entrénelo
from sklearn.tree import DecisionTreeClassifier
dt_clf = DecisionTreeClassifier(max_depth=6)
dt_clf.fit(X, y)
plot_decision_boundary(dt_clf,X,y)
复制代码
dibujar
Dado que al árbol de decisión le gusta ir en línea recta, los resultados de la predicción son los siguientes
Validación cruzada
from sklearn.model_selection import cross_val_score
print(cross_val_score(dt_clf,X, y, cv=5).mean()) #cv决定做几轮交叉验证
#分折交叉验证,会按照原始类别比例分割数据集
from sklearn.model_selection import StratifiedKFold
strKFold = StratifiedKFold(n_splits=5,shuffle=True,random_state=0)
print(cross_val_score(dt_clf,X, y,cv=strKFold).mean())
#留一法交叉验证
from sklearn.model_selection import LeaveOneOut
loout = LeaveOneOut()
print(cross_val_score(dt_clf,X, y,cv=loout).mean())
#可以控制划分迭代次数、每次划分时测试集和训练集的比例(也就是说:可以存在既不在训练集也不再测试集的情况)
from sklearn.model_selection import ShuffleSplit
shufspl = ShuffleSplit(train_size=.5,test_size=.4,n_splits=8) #迭代8次;
print(cross_val_score(dt_clf,X, y,cv=shufspl).mean())
复制代码
Votar con Voting Classifier
Construyendo un clasificador de votaciones
La votación del clasificador de votaciones es una especie de votación dura, es decir, votar después de obtener el resultado de la predicción.
from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier(estimators=[
('knn_clf',KNeighborsClassifier(n_neighbors=7)),
('gnb_clf',GaussianNB()),
('dt_clf', DecisionTreeClassifier(max_depth=6))
],voting='hard')
voting_clf.fit(X_train,y_train)
voting_clf.score(X_test,y_test)
复制代码
dibujar
plot_decision_boundary(voting_clf,X,y)
复制代码
Clasificador de votación suave
El clasificador Soft Voting es un tipo de voto suave, vota con referencia a la probabilidad generada por cada clasificador.
Construyendo un clasificador de votaciones
voting_clf = VotingClassifier(e![请添加图片描述](https://img-blog.csdnimg.cn/88798644fbc0458d88d4f1a97d4f7e17.png)
stimators=[
('knn_clf',KNeighborsClassifier(n_neighbors=7)),
('gnb_clf',GaussianNB()),
('dt_clf', DecisionTreeClassifier(max_depth=6))
],voting='soft')
voting_clf.fit(X_train,y_train)
voting_clf.score(X_test,y_test)
复制代码
dibujar
harpillera
Analizar gramaticalmente
Cree múltiples modelos, seleccione aleatoriamente algunos datos de los datos para entrenar diferentes modelos y determine el resultado de predicción final a través de los resultados de predicción de los múltiples modelos.
Modelos de árboles de decisiones múltiples
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
bagging_clf = BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_samples=100,bootstrap=True)
bagging_clf.fit(X_train,y_train)
bagging_clf.score(X,y)
复制代码
dibujar
Personalmente, creo que el resultado de la predicción de esto es similar al resultado de un solo árbol de decisión, y también es sencillo.
fuera de bolsa-oob
De manera similar al embolsado, la única diferencia es que después de que cada modelo selecciona una parte de los datos, la siguiente selección de modelo solo selecciona el conjunto de datos de los datos no seleccionados.
Código
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
bagging_clf = BaggingClassifier(DecisionTreeClassifier(),#分类器
n_estimators=500,#分类器个数
max_samples=100,#每个模型训练取样本数
bootstrap=True,#放回取样
oob_score=True)#out of bag
bagging_clf.fit(X,y)
bagging_clf.oob_score_
复制代码
dibujar
Los resultados de predicción de esto también son similares, tal vez sea mejor cambiar a otros conjuntos de datos
bosque aleatorio
El efecto del bosque aleatorio es el mismo que el del aprendizaje conjunto compuesto por árboles de decisión múltiple.
Código
from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(n_estimators=500,random_state=666,oob_score=True)
rf_clf.fit(X,y)
rf_clf.oob_score_
复制代码
dibujar
árbol extremo
El algoritmo de árbol aleatorio extremo y el algoritmo de bosque aleatorio se componen de muchos árboles de decisión. La principal diferencia entre los árboles extremos y los bosques aleatorios Los bosques aleatorios usan el modelo de embolsado.Todas las muestras utilizadas por los árboles extremos, pero las características se seleccionan al azar, porque la división es aleatoria, por lo que, en cierta medida, los resultados obtenidos por los bosques aleatorios son más Bueno.
Código
from sklearn.ensemble import ExtraTreesClassifier
et_clf = ExtraTreesClassifier(n_estimators=500,random_state=666,bootstrap=True,oob_score=True)
et_clf.fit(X,y)
et_clf.oob_score_
复制代码
dibujar
Hay un impulso
Al ponderar los resultados de predicción generados por el entrenamiento de cada modelo, se incrementará el peso de los datos que no lograron predecir el modelo anterior y los datos utilizados por el siguiente modelo son los datos ponderados.
Código
from sklearn.ensemble import AdaBoostClassifier
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=6),n_estimators=500)
ada_clf.fit(X_train,y_train)
ada_clf.score(X_test,y_test)
复制代码
dibujar
Aumento de gradiente
Entrenar solo con datos mal predichos
Código
from sklearn.ensemble import GradientBoostingClassifier
gd_clf = GradientBoostingClassifier(max_depth=6,n_estimators=500)
gd_clf.fit(X_train,y_train)
gd_clf.score(X_test,y_test)
复制代码