代码之家  ›  专栏  ›  技术社区  ›  mchd

ValueError:“metrics无法处理二进制和连续目标的混合”,没有源

  •  0
  • mchd  · 技术社区  · 8 年前

    我是一个机器学习的初学者,我正在努力学习通过卡格尔的巨大问题工作。据我所知,我已经确保了这些度量是相互同步的,但我当然要为这个问题责怪自己,而不是Python。然而,我仍然找不到源代码和Spyder IDE是没有帮助的。

    import pandas as pd
    from sklearn.tree import DecisionTreeRegressor
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    
    """Assigning the train & test datasets' adresses to variables"""
    train_path = "C:\\Users\\Omar\\Downloads\\Titanic Data\\train.csv"
    test_path = "C:\\Users\\Omar\\Downloads\\Titanic Data\\test.csv"
    
    """Using pandas' read_csv() function to read the datasets
    and then assigning them to their own variables"""
    train_data = pd.read_csv(train_path)
    test_data = pd.read_csv(test_path)
    
    """Using pandas' factorize() function to represent genders (male/female)
    with binary values (0/1)"""
    train_data['Sex'] = pd.factorize(train_data.Sex)[0]
    test_data['Sex'] = pd.factorize(test_data.Sex)[0]
    
    """Replacing missing values in the training and test dataset with 0"""
    train_data.fillna(0.0, inplace = True)
    test_data.fillna(0.0, inplace = True)
    
    """Selecting features for training"""
    columns_of_interest = ['Pclass', 'Sex', 'Age']
    
    """Dropping missing/NaN values from the training dataset"""
    filtered_titanic_data = train_data.dropna(axis=0)
    
    """Using the predictory features in the data to handle the x axis"""
    x = filtered_titanic_data[columns_of_interest]
    
    """The survival (what we're trying to find) is the y axis"""
    y = filtered_titanic_data.Survived
    
    """Splitting the train data with test"""
    train_x, val_x, train_y, val_y = train_test_split(x, y, random_state=0)
    
    """Assigning the DecisionTreeRegressor model to a variable"""
    titanic_model = DecisionTreeRegressor()
    
    """Fitting the x and y values with the model"""
    titanic_model.fit(train_x, train_y)
    
    """Predicting the x-axis"""
    val_predictions = titanic_model.predict(val_x)
    
    """Assigning the feature columns from the test to a variable"""
    test_x = test_data[columns_of_interest]
    
    """Predicting the test by feeding its x axis into the model"""
    test_predictions = titanic_model.predict(test_x)
    
    """Printing the prediction"""
    print(val_predictions)
    
    """Checking for the accuracy"""
    print(accuracy_score(val_y, val_predictions))
    
    """Printing the test prediction"""
    print(test_predictions)
    

    这是stacktrace:

    Traceback (most recent call last):
    
      File "<ipython-input-3-73797c87986e>", line 1, in <module>
        runfile('C:/Users/Omar/Downloads/Kaggle Competition/Titanic.py', wdir='C:/Users/Omar/Downloads/Kaggle Competition')
    
      File "C:\Users\Omar\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
        execfile(filename, namespace)
    
      File "C:\Users\Omar\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
        exec(compile(f.read(), filename, 'exec'), namespace)
    
      File "C:/Users/Omar/Downloads/Kaggle Competition/Titanic.py", line 58, in <module>
        print(accuracy_score(val_y, val_predictions))
    
      File "C:\Users\Omar\Anaconda3\lib\site-packages\sklearn\metrics\classification.py", line 176, in accuracy_score
        y_type, y_true, y_pred = _check_targets(y_true, y_pred)
    
      File "C:\Users\Omar\Anaconda3\lib\site-packages\sklearn\metrics\classification.py", line 81, in _check_targets
        "and {1} targets".format(type_true, type_pred))
    
    ValueError: Classification metrics can't handle a mix of binary and continuous targets
    
    3 回复  |  直到 8 年前
        1
  •  1
  •   desertnaut SKZI    8 年前

    您正在尝试使用回归算法( DecisionTreeRegressor accuracy_score ,错误实际发生的位置:

    File "C:/Users/Omar/Downloads/Kaggle Competition/Titanic.py", line 58, in <module>
        print(accuracy_score(val_y, val_predictions)) 
    

    需要二进制数,因此会出现错误。

    首先,将您的模型更改为

    from sklearn.tree import DecisionTreeClassifier
    
    titanic_model = DecisionTreeClassifier()
    
        2
  •  1
  •   Raunaq Jain    8 年前

    你使用的是一个DecisionTreeRegressor,正如它所说的,是一个回归模型。卡格尔泰坦尼克号问题是一个分类问题。所以你应该使用DecisionTreeClassifier。

    val_y 具有二进制值 (0,1) 鉴于 val_predictions 具有连续值,因为您使用了回归模型。

        3
  •  0
  •   S.Dasgupta    8 年前

    分类需要离散的标签,因为它可以预测类(标签中的任何一个),回归可以处理连续的数据。由于输出是类标签,因此需要执行分类