[Machine Learning] Avaliação do modelo - treinamento e avaliação do modelo de conjunto de dígitos manuscritos


prefácio

Anteriormente, apresentamos os métodos e indicadores comuns de avaliação do modelo. Agora vamos treinar o conjunto de dígitos manuscritos, avaliar nosso modelo por meio de diferentes métodos e aumentar ainda mais nossa compreensão dos métodos e indicadores de avaliação do modelo.

1. Carregamento do conjunto de dados

import matplotlib
import pandas as pd
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
#%%
from sklearn.datasets import load_digits
data=load_digits()
print(data.data.shape)

insira a descrição da imagem aqui
Existem 1797 (8x8) imagens digitais escritas, vamos mostrá-las

plt.gray()
plt.figure(figsize=(8,6))
plt.imshow(data.images[0])
plt.show()

insira a descrição da imagem aqui
Este pixel da imagem foi processado, mas ainda podemos ver claramente que é 0

2. Divida o conjunto de treinamento e o conjunto de teste, operação de embaralhamento, duas classificações

Aqui listamos a proporção do conjunto de teste para o conjunto de teste como 7:3

from sklearn.model_selection import train_test_split
X,y=data.data,data.target
X_train,y_train,X_test,y_test=train_test_split(X,y,test_size=0.3,random_state=42)

Como o conjunto de dados tem uma certa regularidade de 0 a 9, existe uma correlação entre os dois, então embaralhamos os dados de treinamento

indexs=np.random.permutation(len(X_train))#permutaion的根据给出n长度,生成一个乱的从0到n的数组
X_train,y_train=X_train[indexs],y_train[indexs]

Como o conjunto de dados tem 0 a 9, 10 tipos, vamos integrar os dados em um conjunto de classificação binária, dividido em não 2 números e 2 números

y_train_2=(y_train==2)
y_test_2=(y_test==2)

3. Modelo de treinamento e previsão

Usamos o classificador de gradiente descendente SGDClassifier do modelo linear sklearn

from sklearn.linear_model import SGDClassifier
sgd_clf=SGDClassifier(max_iter=10,random_state=42)
sgd_clf.fit(X_train,y_train_2)
y_prediction=sgd_clf.predict(X[2].reshape(1,-1))
print(y_prediction)

insira a descrição da imagem aqui
A previsão retorna True, vamos imprimir o número da posição para ver

print(y_prediction)
print(y[2])

insira a descrição da imagem aqui
Pode-se ver que a previsão foi bem sucedida

4. Avaliação do modelo

1. Validação Cruzada

A validação cruzada é dividir o conjunto de treinamento em várias partes e, em seguida, usar uma parte como conjunto de teste e as outras partes são usadas como conjunto de treinamento para verificar umas às outras até que cada parte seja avaliada como o conjunto de verificação, de modo que o O método pode comparar os conjuntos de dados Menos é mais amigável. A função cross_val_score pode nos ajudar a avaliar melhor o desempenho do modelo no conjunto de dados e escolher o modelo ideal. Ao mesmo tempo, usando a validação cruzada, podemos fazer melhor uso do conjunto de dados limitado e reduzir o overfitting do modelo.

from sklearn.model_selection import cross_val_score
cross_val_scores=cross_val_score(sgd_clf,X_train,y_train_2,cv=3,scoring='accuracy')#切割成3份
print('交叉验证得分 ',cross_val_scores)
print('交叉验证平均分 ',cross_val_scores.mean())
print('交叉验证方差 ',cross_val_scores.std())

insira a descrição da imagem aqui

Pode-se observar que a pontuação média ainda é bastante alta, indicando que nosso modelo é melhor

Para melhor analisar o desempenho do modelo, podemos usar cross_val_predict, que é uma função no Scikit-learn, que é usada para realizar a validação cruzada e retornar os resultados previstos do modelo.
Especificamente, a função cross_val_predict pode receber um modelo de aprendizado de máquina, dados de treinamento, variáveis ​​de destino e parâmetros de validação cruzada e, em seguida, retornar uma matriz contendo os resultados de previsão de cada validação cruzada. Esses resultados de previsão podem ser usados ​​para avaliar o desempenho do modelo no conjunto de dados e realizar análises e processamentos subsequentes.
Ao contrário da função cross_val_score, a função cross_val_predict retorna o resultado da previsão de cada amostra, não a pontuação de cada validação cruzada. Isso significa que podemos obter informações mais detalhadas sobre o desempenho do modelo e realizar análises e ajustes mais profundos.

from sklearn.model_selection import cross_val_predict
cross_val_predicts=cross_val_predict(sgd_clf,X_train,y_train_2,cv=3)
print('cross_val_predicts: ',cross_val_predicts)

insira a descrição da imagem aqui

2. Matriz de confusão-matriz de confusão

Os seguintes indicadores foram mencionados no artigo anterior, então não vamos explicar muito

Nós dissemos acimaTP,FP,TN,FNagora vamos pegar

from sklearn.metrics import confusion_matrix

confusion_matrixs=confusion_matrix(y_train_2,cross_val_predicts)
print(confusion_matrixs)

insira a descrição da imagem aqui
Aqui é simplesmente expresso como

[[TN FN]
[FP TP]]
Explicação: Reconhecemos com êxito 126 dígitos como 2 e reconhecemos erroneamente 4 caracteres diferentes de 2 como 2

2.1 Precisão,rechamada,f1_sorce

from sklearn.metrics import precision_score,recall_score,f1_score
precision_score=precision_score(y_train_2,cross_val_predicts)
recall_score=recall_score(y_train_2,cross_val_predicts)
f1_score=f1_score(y_train_2,cross_val_predicts)
print('精度:',precision_score)
print('召回',recall_score)
print('调和平均数:',f1_score)

insira a descrição da imagem aqui

2.2 A influência da curva ROC e limiar nos resultados

montamos[5,2,4,3,2,2,2,2]
É o resultado previsto pelo modelo, e da esquerda para a direita está a pontuação da decisão [12, 22, 33, 42, 54, 63, 74, 80]. Quanto maior a pontuação da decisão, maior a taxa correta. tempo, definimos a pontuação limite para 40. Em seguida, ela é dividida em duas partes pelo tamanho da pontuação, e a da esquerda é aquela em que nossa previsão falhouFN, a direita prevê o sucessoTN, por meio das respectivas fórmulas de cálculo afetará nossas pontuações de precisão e recuperação, portanto, a escolha de um limite apropriado pode melhorar efetivamente nossa avaliação de modelo.

Acima sabemos que X[2] é 2, que é True. Verificamos seu valor de pontuação de decisão. O Scikit-Learn não permite definir o limite diretamente, mas pode obter a pontuação de decisão e chamar seu método decision_function().

O Scikit-Learn não permite definir o limite diretamente, mas pode obter a pontuação de decisão,
chamando seu método decision_function()

y_sorce=sgd_clf.decision_function(X[2].reshape(1,-1))
print(y_sorce)

insira a descrição da imagem aqui

Podemos obter todas as pontuações de decisão ao mesmo tempo

y_sorce=cross_val_predict(sgd_clf,X_train,y_train_2,cv=3,method='decision_function')
print(y_sorce[0:15])

insira a descrição da imagem aqui

Obtenha todos os seus limites
preciso_recall_curve é uma função no Scikit-learn, que é usada para calcular o valor e o limite da precisão e recuperação do modelo de classificação.
Especificamente, a função precisão_recall_curve pode receber a probabilidade prevista e o rótulo real de um modelo de classificação binária e, em seguida, calcular a precisão e a taxa de rechamada sob uma série de limites, bem como o valor do limite correspondente. Esses valores de precisão, rechamada e limite podem ser usados ​​para desenhar curvas de rechamada de precisão ou para calcular métricas de desempenho, como a precisão média do modelo.

from sklearn.metrics import precision_recall_curve
predictions,recalls,thresholds=precision_recall_curve(y_train_2,y_sorce)

insira a descrição da imagem aqui
Desenhamos um gráfico de linhas e observamos a situação

sns.set_theme(style="darkgrid")
data_line=pd.DataFrame({
    
    "predictions":predictions[:len(thresholds)],"recalls":recalls[:len(thresholds)],'thresholds':thresholds})
sns.lineplot(x='thresholds',y='predictions',data=data_line)
sns.lineplot(x='thresholds',y='recalls',data=data_line)
# plt.savefig(f'D:\博客文档\模型评估\{random.randint(1,100)}.png')
plt.show()

insira a descrição da imagem aqui

Perto de 0, a precisão e a taxa de recuperação são as mais altas, e são próximas de 0 e simétricas, e descobrimos que a alteração do limite tem um grande impacto no resultado; portanto, precisamos ser cautelosos ao definir o limite.

  • AUC值 (Área sob a curva ROC)


Para obter o limite ideal, também podemos obter o valor AUC , e a função roc_curve usada para desenhar a curva ROC é uma função na biblioteca scikit-learn para desenhar a curva ROC (Receiver Operating Characteristic Curve), que é usada para avaliar desempenho do modelo de classificação binária. A curva ROC mostra a Taxa Positiva Verdadeiratpre taxa de falso positivo (taxa de falso positivo)fprA relação entre pode nos ajudar a escolher o melhor limite para o modelo de classificação.

  • Derivamos tpr, fpr, limiar, plotamos observações ROC
from sklearn.metrics import roc_curve
fpr,tpr,thresholds=roc_curve(y_train_2,y_sorce)
line_data=pd.DataFrame({
    
    'fpr':fpr,'tpr':tpr,'thresholds':thresholds})
sns.lineplot(data=line_data,x='fpr',y='tpr',)
sns.lineplot(data=pd.DataFrame({
    
    'x':[0,1],'y':[0,1]}))
plt.show()

insira a descrição da imagem aqui

A linha tracejada representa a curva ROC para um classificador puramente aleatório; um bom classificador está o mais longe possível dessa linha (no canto superior esquerdo) e fica claro que nosso classificador de modelo é muito bom.

Também podemos calcular nosso valor AUC com roc_auc_score

from sklearn.metrics import roc_auc_score
roc_auc_score=roc_auc_score(y_train_2,y_sorce)
print("AUC值:",roc_auc_score)

insira a descrição da imagem aqui
Pontuação yyds, eu realmente espero que o valor AUC de todos os meus modelos futuros seja tão alto

  • Encontrar o limite ideal geralmente precisa ser determinado combinando os cenários de aplicação reais e os indicadores de desempenho do modelo de classificação.

Um método comumente usado é determinar o limite ideal com base nos pontos de coordenadas na curva ROC. Na curva ROC, podemos encontrar o limite ótimo calculando as coordenadas FPR e TPR correspondentes a cada limite. Normalmente, podemos escolher o limite ideal de acordo com os seguintes indicadores:

  • Maximize TPR: Quando prestamos mais atenção à taxa de recuperação do modelo (ou seja, a taxa de verdadeiro positivo), podemos escolher o limite que maximiza o TPR como o limite ideal.

  • Minimizar FPR: Quando prestamos mais atenção à taxa de precisão do modelo (ou seja, taxa de falsos positivos), podemos escolher o limite que minimiza o FPR como o limite ideal.

  • Maximize AUC: Quando queremos considerar de forma abrangente a precisão e a recuperação do modelo, podemos escolher o limite que maximiza a AUC (Área sob a curva) como o limite ideal.

  • Exemplo Se prestarmos mais atenção à taxa de rechamada do modelo, podemos continuar a usar os valores fpr, tpr, limiares acima.

from sklearn.metrics import roc_curve
fpr,tpr,thresholds=roc_curve(y_train_2,y_sorce)
# 找到最大化 TPR 的阈值
good_threshold = thresholds[np.argmax(tpr)]
print('最优阈值',good_threshold)

insira a descrição da imagem aqui
Adicione-o ao modelo e calcule a taxa de recall

recall_scores=recall_score(y_train_2,cross_val_predicts)
print('没设置最优阈值recall_sorce:',recall_scores)
y_pred=(cross_val_predicts>good_threshold)
recall_score=recall_score(y_train_2,y_pred)
print('设置最优阈值后recall_sorce:',recall_scores)

O resultado é bastante embaraçoso. Podemos ver na figura acima que nosso modelo de classificação ainda é muito bom, então não pode ser otimizado, talvez, talvez.
insira a descrição da imagem aqui
Em seguida, execute-o novamente e ainda funcionará.
insira a descrição da imagem aqui

  • Ou usamos o método mais antigo, cada limite é testado novamente
from sklearn.metrics import recall_score

for threshold in thresholds:
    b_recall_scoress = recall_score(y_train_2, cross_val_predicts)
    y_pred = (cross_val_predicts > threshold)

    e_recall_score = recall_score(y_train_2, y_pred)
    max_good_threshold.append(threshold)
    beging_recalls.append(b_recall_scoress)
    end_recalss.append(e_recall_score)

end_good_recalls_index=np.argmax(end_recalss)
b_recalss=beging_recalls[end_good_recalls_index]
e_threshold=max_good_threshold[end_good_recalls_index]
e_reclass=end_recalss[end_good_recalls_index]

print('最优阈值',e_threshold)
print('优化前',b_recalss)
print('优化后',e_reclass)

insira a descrição da imagem aqui

Após a otimização do limite, o recall ainda é significativamente melhorado

V. Resumo

Nesta seção, explicamos vários métodos de avaliação do modelo e obtemos o limite ideal em detalhes, o que nos ajudará a avaliar e otimizar melhor o modelo.
Espero que você me apoie muito, vou trabalhar mais para aprender e compartilhar coisas mais interessantes

Acho que você gosta

Origin blog.csdn.net/qq_61260911/article/details/129959869
Recomendado
Clasificación