1
resposta

[Sugestão] Um resultado "surpreendente" mostra limitação de modelo linear


#
# A execução deste código mostra que 
# um modelo linear pode ter 
# percentual de acerto inferior a 100 por cento 
# mesmo que os dados submetidos à classificação 
# sejam idênticos aos dados que originam o modelo linear
#




#  features:

#     tem pelo longo? (1 sim, 0 não)
#     tem perna curta? (1 sim, 0 não)
#     late? (1 sim, 0 não)

porco1 = [0, 1, 0]
porco2 = [0, 1, 1]
porco3 = [1, 1, 0]

cachorro1 = [0, 1, 1]
cachorro2 = [1, 0, 1]
cachorro3 = [1, 1, 1]

dados = [porco1, porco2, porco3, cachorro1, cachorro2, cachorro3]

# classes de dados:
#
# 1 => porco
# 0 => cachorro

classes_exatas_de_dados = [1,1,1,0,0,0]

from sklearn.svm import LinearSVC

modelo_linear = LinearSVC ()
modelo_linear .fit ( dados , classes_exatas_de_dados )

dados_identicos_aos_originais = dados 
classes_modeladas_de_dados = modelo_linear .predict ( dados_identicos_aos_originais )

from sklearn.metrics import accuracy_score

acuracia_de_acerto = accuracy_score ( classes_exatas_de_dados , classes_modeladas_de_dados )

percentual_de_acerto = 100.0 * acuracia_de_acerto 


print ( "Ao classificar dados identicos aos que originam " )
print ( "um modelo linear verificamos o seguinte: ")
print ( ) 

print ( "- as classes dos dados originais são: " )
print ( classes_exatas_de_dados ) 
print ( )

print ( "- os dados originais são: " )
print ( dados ) 
print ( ) 

print ( "- os dados submetidos à classificação são: " ) 
print ( dados_identicos_aos_originais )
print ( ) 

print ( "- as classes que o modelo atribui aos dados submetidos são: " )
print ( classes_modeladas_de_dados ) 
print ( ) 

print ( "- neste exemplo, em que os dados submetidos à classificação " )
print ( "pelo modelo linear são idênticos aos dados que originam o próprio modelo, ")
print ( "o percentual de acerto é ", percentual_de_acerto )
print ( "então," )
print ( "podemos afirmar que o percentual de acerto" )

praticamente_igual_a_100 = "não é 100 por cento "
if ( percentual_de_acerto >= 99.99 ) :
    praticamente_igual_a_100 = "é praticamente 100 por cento"

print ( praticamente_igual_a_100 )
print ( )



A execução deste código produz a seguinte escrita:
Ao classificar dados identicos aos que originam 
um modelo linear verificamos o seguinte: 

- as classes dos dados originais são: 
[1, 1, 1, 0, 0, 0]

- os dados originais são: 
[[0, 1, 0], [0, 1, 1], [1, 1, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]]

- os dados submetidos à classificação são: 
[[0, 1, 0], [0, 1, 1], [1, 1, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]]

- as classes que o modelo atribui aos dados submetidos são: 
[1 0 1 0 0 0]

- neste exemplo, em que os dados submetidos à classificação 
pelo modelo linear são idênticos aos dados que originam o próprio modelo, 
o percentual de acerto é  83.33333333333334
então,
podemos afirmar que o percentual de acerto
não é 100 por cento 

1 resposta

Interessante, porém penso que medir acurácia do treino não é um bom critério para avaliar um modelo.

Todo modelo é uma simplificação, e portanto, tem suas limitações. Além disso, todo modelo tem um viés e assume algumas premissas, cabe a cientista/analista de dados avaliar se essas premissas fazem sentido para o problema que está tentando resolver.

Por outro lado, é importante notar que esse viés (ou limitação) do modelo é justamente o que permite o aprendizado (a capacidade de generalização). Por exemplo, suponha um caso em que seus dados contivessem algumas amostras incorretas, qual modelo seria mais útil?

  1. Um modelo que "decora" os dados do treino, e portanto atinge 100% de acurácia no treino
  2. Um modelo capaz de ignorar aspectos menos relevantes nos dados (generalizar)

O modelo 1 provavelmente teria um desempenho péssimo em dados não vistos por estar sobreajustado (overfitted). O modelo 2 não atingiria 100% de acurácia no treino, porém provavelmente teria um desempenho melhor em dados não vistos já que é capaz de generalizar.