1
resposta

Problemas com ajuste de modelo a partir de atributos do tipo ndarray (setting an array element with a sequence.)

Meu dataset (treino_set)

descritores;span;tipo

[4.333071178949439e-15, 24.84928492867941, 12....]; 157.237531; 3

[1.0849128708666645e-14, 27.27532469343159, 12...] ; 109.656511; 2

X = treino_set[["descritores","span"]] #Shape - (28689, 2)

y = treino_set[["tipo"]] #Shape - (28689, 1)

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

modelo = RandomForestClassifier(n_estimators=1024)

modelo.fit(X, y)

Erros:


TypeError                                 Traceback (most recent call last)
TypeError: only size-1 arrays can be converted to Python scalars

The above exception was the direct cause of the following exception:

ValueError                                Traceback (most recent call last)
<ipython-input-144-f95036ce816e> in <module>
      3 
      4 modelo = RandomForestClassifier(n_estimators=1024)
----> 5 modelo.fit(X, y)
      6 
      7 print("Precisão do conjunto de treino: {}".format(modelo.score(X, y)))

c:\users\joaon\desktop\doutorado\ensaios\tensorflow-keras\lib\site-packages\sklearn\ensemble\_forest.py in fit(self, X, y, sample_weight)
    301                 "sparse multilabel-indicator for y is not supported."
    302             )
--> 303         X, y = self._validate_data(X, y, multi_output=True,
    304                                    accept_sparse="csc", dtype=DTYPE)
    305         if sample_weight is not None:

c:\users\joaon\desktop\doutorado\ensaios\tensorflow-keras\lib\site-packages\sklearn\base.py in _validate_data(self, X, y, reset, validate_separately, **check_params)
    430                 y = check_array(y, **check_y_params)
    431             else:
--> 432                 X, y = check_X_y(X, y, **check_params)
    433             out = X, y
    434 

c:\users\joaon\desktop\doutorado\ensaios\tensorflow-keras\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, **kwargs)
     71                           FutureWarning)
     72         kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 73         return f(**kwargs)
     74     return inner_f
     75 

c:\users\joaon\desktop\doutorado\ensaios\tensorflow-keras\lib\site-packages\sklearn\utils\validation.py in check_X_y(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, estimator)
    794         raise ValueError("y cannot be None")
    795 
--> 796     X = check_array(X, accept_sparse=accept_sparse,
    797                     accept_large_sparse=accept_large_sparse,
    798                     dtype=dtype, order=order, copy=copy,

c:\users\joaon\desktop\doutorado\ensaios\tensorflow-keras\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, **kwargs)
     71                           FutureWarning)
     72         kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 73         return f(**kwargs)
     74     return inner_f
     75 

c:\users\joaon\desktop\doutorado\ensaios\tensorflow-keras\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator)
    597                     array = array.astype(dtype, casting="unsafe", copy=False)
    598                 else:
--> 599                     array = np.asarray(array, order=order, dtype=dtype)
    600             except ComplexWarning:
    601                 raise ValueError("Complex data not supported\n"

c:\users\joaon\desktop\doutorado\ensaios\tensorflow-keras\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
     83 
     84     """
---> 85     return array(a, dtype, copy=False, order=order)
     86 
     87 

ValueError: setting an array element with a sequence.
1 resposta

Olá João.

O erro está dizendo que uma da sua colunas contem itens que são array também:

ValueError: setting an array element with a sequence.

Entendo que o problema é a coluna descritores, que contem um array.

descritores;span;tipo

[4.333071178949439e-15, 24.84928492867941, 12....]; 157.237531; 3

[1.0849128708666645e-14, 27.27532469343159, 12...] ; 109.656511; 2

Uma solução bem manual que encontrei foi essa:

a = []
b = []
c = []
for item in treino_set.descritores:
    a.append(item[0])
    b.append(item[1])
    c.append(item[2])
a = pd.Series(a, name='A')
b = pd.Series(b, name='B')
c = pd.Series(c, name='C')

A quantidade de arrays (a, b, c) vai depender da quantidade elementos que tem no seu descritores, pelo que postou tem pelo menos três valores. Depois de separar os valores preservando a posição deles, vamos concatena-los juntos com o seu DF original.

treino_set_separado = pd.concat([treino_set, a, b, c], axis=1).head()

Agora com os dados separados, podemos fazer o treinamento novamente:

X = treino_set_separado [['A', 'B', 'C', "span"]] #Shape - (28689, 4)

y = treino_set_separado ["tipo"] #Shape - (28689, )

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

modelo = RandomForestClassifier(n_estimators=1024)

modelo.fit(X, y)

Outro detalhe que gerava apenas um Warning é o y = treino_set[["tipo"]] que na verdade vai gerar o y com uma dimensão maior do que a esperada pelo fit, basta remover um dos colchetes y = treino_set["tipo"] .

Essa foi a solução mais rápida que encontrei, mas provavelmente o próprio Pandas deve ter uma solução para essa situação, caso eu encontre eu posto aqui.

Espero ter ajudado, mas qualquer duvida não hesite em perguntar.

Bons Estudos.