【问题标题】:在自定义类中使用 train_test_split 时出现类型错误(单例数组...)
【发布时间】:2021-03-12 21:20:51
【问题描述】:

TypeError: Singleton array array(<__main__.azhu_emailclassifier_2> 处的对象,dtype=object) 不能被视为 有效的集合。

当我尝试在我的自定义 AZHU_EmailClassifier_2 类中运行 train_test_split 函数时收到此错误。

我的班级:

class AZHU_EmailClassifier_2:
    import os
    import numpy as np
    import pandas as pd
    from sklearn.model_selection import train_test_split

    def __init__(self):
        pass
    
    def retrain_model(self, csv_file):
        
        MIN_ROW_NUMBER = 500
        TEST_SIZE = 0.25
        RANDOM_STATE = 42
        
        self.os.chdir(r"c:\LORI\PROJECTS\ALLIANZ\INCOMING_CHANNELS") # <---- a retraining file mappaja
        
        df=self.pd.read_excel(csv_file,error_bad_lines=False, header=None)
        
        df.dropna(axis=0,how='any', inplace=True)
             
        rows_no=df.shape[0]
        if rows_no<MIN_ROW_NUMBER:
            print("Insufficient number of rows (<35.000)! RETRAINING ABORTED")
            return None

        X=df[0]
        y=df[1]
        
        X_train, X_test, y_train, y_test=self.train_test_split(X,y)
        #X_train, X_test, y_train, y_test=self.train_test_split(X,y,test_size=TEST_SIZE, random_state=RANDOM_STATE, stratify=y)
        
        return X_train
                

运行 train_test_split 函数时触发错误。

整个错误信息:

----------------------------------- ---------------------------- TypeError Traceback(最近一次调用 最后)在 1 个实例 = AZHU_EmailClassifier_2() 2 ----> 3 instance.retrain_model("retraining_dummy.xlsx")

在 retrain_model(self, csv_file) 28 岁=df[1] 29 ---> 30 X_train, X_test, y_train, y_test=self.train_test_split(X,y) 31 #X_train, X_test, y_train, y_test=self.train_test_split(X,y,test_size=TEST_SIZE, 随机状态=随机状态,分层=y) 32

~\Anaconda3\lib\site-packages\sklearn\model_selection_split.py 在 train_test_split(*arrays, **options) 2125 提高 TypeError("传递的参数无效:%s" % str(options)) 2126 -> 2127 个数组 = 可索引(*arrays)2128 2129 n_samples = _num_samples(arrays[0])

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py 在 可索引(*可迭代) 第291章 292 结果 = [_make_indexable(X) for X in iterables] --> 293 check_consistent_length(*结果) 294 返回结果 295

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py 在 check_consistent_length(*数组) 第251章 252 --> 253 个长度 = [_num_samples(X) for X in array if X is not None] 254 个唯一值 = np.unique(长度) 255 如果 len(uniques) > 1:

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py 在 (.0) 第251章 252 --> 253 个长度 = [_num_samples(X) for X in array if X is not None] 254 个唯一值 = np.unique(长度) 255 如果 len(uniques) > 1:

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py 在 _num_samples(x) 194 如果 hasattr(x, 'shape') 和 x.shape 不是无: 195 如果 len(x.shape) == 0: --> 196 raise TypeError("不能考虑单例数组%r" 197“一个有效的集合。” % X) 198 # 检查 shape 是否返回整数或默认为 len

TypeError: Singleton array array(ma​​in.AZHU_EmailClassifier_2 对象位于 0x000001D6E7A68F10>, dtype=object) 不能被视为有效集合。

我不知道它为什么会抛出这个错误。你能指出我正确的方向吗?任何帮助表示赞赏!

【问题讨论】:

    标签: python-3.x scikit-learn


    【解决方案1】:

    您收到此错误是因为您在类中导入了train_test_split,因此,train_test_split 成为绑定方法而不是函数,并且每当调用该方法时,实例将作为第一个参数传递。这是一个可以重建情况的最小示例

    class test():
        
        from sklearn.model_selection import train_test_split
        
        def retrain_model(self):
            print(self.train_test_split)
            print(self.train_test_split())
        
    test_instance = test()
    test_instance.retrain_model()
    

    运行此脚本后,您将获得TypeError

    TypeError: Singleton array array(<__main__.test object at 0x7ffa473ae438>, dtype=object) cannot be considered a valid collection.
    

    self.train_test_split在内存中的位置也是0x7ffa473ae438

    根据PEP8

    导入总是放在文件的顶部,就在任何模块之后 cmets 和 docstrings,以及模块全局变量和常量之前。

    因此,最简单的解决方案是在类外导入所有内容,直接调用train_test_split

    import numpy as np
    import pandas as pd
    from sklearn.model_selection import train_test_split
    
    class AZHU_EmailClassifier_2():
    
        def __init__(self):
            pass
        
        def retrain_model(self,):
            
            MIN_ROW_NUMBER = 20
            TEST_SIZE = 0.25
            RANDOM_STATE = 42
                    
            df = pd.DataFrame({0:np.linspace(1,100,100),1:np.random.rand(100)})
            X=df[0];y=df[1]
            X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=TEST_SIZE,random_state=RANDOM_STATE)
            
            return X_train
    
    test = AZHU_EmailClassifier_2()
    test.retrain_model()
    

    【讨论】:

    • 谢谢!这是完美的答案。我没有意识到这一点,但学得很好!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-04-28
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多