web-dev-qa-db-ja.com

シングルトン配列array(<0x7f3a311320d0の関数列、dtype = object)は有効なコレクションとは見なされません

修正方法がわからない。どんな助けも感謝します。私は ベクトル化:有効なコレクションではありません を見ましたが、これを理解しているかどうかはわかりません

    train = df1.iloc[:,[4,6]]
            target =df1.iloc[:,[0]]

            def train(classifier, X, y):
                X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)

                classifier.fit(X_train, y_train)
                print ("Accuracy: %s" % classifier.score(X_test, y_test))
                return classifier

        trial1 = Pipeline([
            ('vectorizer', TfidfVectorizer()),
            ('classifier', MultinomialNB()),
        ])

        train(trial1, train, target)

以下のエラー:

    ----> 6 train(trial1, train, target)

    <ipython-input-140-ac0e8d32795e> in train(classifier, X, y)
          1 def train(classifier, X, y):
    ----> 2     X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)
          3 
          4     classifier.fit(X_train, y_train)
          5     print ("Accuracy: %s" % classifier.score(X_test, y_test))

    /home/manisha/anaconda3/lib/python3.5/site-packages/sklearn/model_selection/_split.py in train_test_split(*arrays, **options)
       1687         test_size = 0.25
       1688 
    -> 1689     arrays = indexable(*arrays)
       1690 
       1691     if stratify is not None:

    /home/manisha/anaconda3/lib/python3.5/site-packages/sklearn/utils/validation.py in indexable(*iterables)
        204         else:
        205             result.append(np.array(X))
    --> 206     check_consistent_length(*result)
        207     return result
        208 

    /home/manisha/anaconda3/lib/python3.5/site-packages/sklearn/utils/validation.py in check_consistent_length(*arrays)
        175     """
        176 
    --> 177     lengths = [_num_samples(X) for X in arrays if X is not None]
        178     uniques = np.unique(lengths)
        179     if len(uniques) > 1:

    /home/manisha/anaconda3/lib/python3.5/site-packages/sklearn/utils/validation.py in <listcomp>(.0)
        175     """
        176 
    --> 177     lengths = [_num_samples(X) for X in arrays if X is not None]
        178     uniques = np.unique(lengths)
        179     if len(uniques) > 1:

    /home/manisha/anaconda3/lib/python3.5/site-packages/sklearn/utils/validation.py in _num_samples(x)
        124         if len(x.shape) == 0:
        125             raise TypeError("Singleton array %r cannot be considered"
    --> 126                             " a valid collection." % x)
        127         return x.shape[0]
        128     else:

    TypeError: Singleton array array(<function train at 0x7f3a311320d0>, dtype=object) cannot be considered a valid collection.

 ____

修正方法がわからない。どんな助けも感謝します。私は ベクトル化:有効なコレクションではありません を見ましたが、これを理解しているかどうかはわかりません

9
manisha

このエラーは、関数trainが変数trainをマスクするために発生し、それ自体に渡されます。

説明

次のように変数トレインを定義します。

train = df1.iloc[:,[4,6]]

次に、いくつかの行の後、次のようなメソッドトレインを定義します。

def train(classifier, X, y):

実際に起こることは、以前のバージョンのtrainが新しいバージョンで更新されることです。これは、trainが必要に応じてDataframeオブジェクトを指すのではなく、定義した関数を指すことを意味します。エラーではクリアされます。

array(<function train at 0x7f3a311320d0>, dtype=object)

エラーステートメント内のfunction trainを参照してください。

ソリューション

それらの1つ(変数またはメソッド)の名前を変更します。 提案:関数の名前をtrainingtraining_funcなどの別の名前に変更します。

6
Vivek Kumar

別のコンテキストで同じエラーが発生しました(sklearn train_test_split)理由は、単にキーワード引数として位置引数を渡したために、呼び出された関数が誤って解釈されたためです。

9
dopexxx

最初の答えのバリエーション-これを取得できる別の理由は、データの列名がデータを含むオブジェクトの属性/メソッドと同じ場合です。

私の場合、表面上正当な構文df.countを使用して、データフレーム「df」の列「count」にアクセスしようとしました。

ただし、countはpandasデータフレームオブジェクトの属性と見なされます。名前の衝突により、(ややこしい)エラーが発生します。

1
Info5ek

sklearn.model_selection train_test_splitでも同じエラーが発生しましたが、私の場合、sparkデータフレームの配列ではなく、Pandasデータフレームから派生した配列を関数に提供していたためです。以下のようなtoPandas()関数を使用してデータをpandasデータフレームに変換し、Pandas dfをtrain_test_splitに提供すると、問題は修正されました。

pandas_df=spark_df.toPandas()

エラー:

features_to_use = ['Feature1', 'Feature2']
x5D = np.array(spark_df[ features_to_use ])
y5D = np.array(spark_df['TargetFeature'])
X_train, X_test, y_train, y_test = train_test_split(x5D, y5D, train_size=0.8)

一定:

pandas_df=spark_df.toPandas()
features_to_use = ['Feature1', 'Feature2']
x5D = np.array(pandas_df[ features_to_use ])
y5D = np.array(pandas_df['TargetFeature'])
X_train, X_test, y_train, y_test = train_test_split(x5D, y5D, train_size=0.8)
0
Orhan Celik