我目前正在从头开始学习逻辑回归。我正在创建一个逻辑回归模型的基础上改变形式的虹膜数据集我。以下是我的代码摘录:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
df = pd.read_excel('Iris_Dataset.xlsx')
df = df.dropna()
colour = pd.get_dummies(df.colour, drop_first = True)
species = pd.get_dummies(df.species, drop_first = True)
df = pd.concat([df, colour, species], axis = 1)
df = df.drop(['colour', 'species'], axis = 1)
x = df.drop(["versicolor", "virginica"], axis = 1)
y = pd.concat([df.versicolor, df.virginica], axis = 1)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 1)
model = LogisticRegression()
model.fit(x_train, y_train)
出于某种原因,在最后一条语句(model.fit(x_train,y_train))中,我得到了以下错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-2-0c77380c6ea5> in <module>()
18 model = LogisticRegression()
19
---> 20 model.fit(x_train, y_train)
/usr/local/lib/python3.7/dist-packages/sklearn/utils/validation.py in column_or_1d(y, warn)
795 return np.ravel(y)
796
--> 797 raise ValueError("bad input shape {0}".format(shape))
798
799
ValueError: bad input shape (86, 2)
我无法理解错误的含义,也无法理解为什么我会出现这种错误,无论我如何尝试。请帮我做这个。
顺便说一下,这是数据集。它是google表单的形式,但我在microsoft excel中粘贴了与iris_dataset.xlsx相同的数据集副本(我不知道如何直接共享excel文件):https://docs.google.com/spreadsheets/d/18zkzvpq5q_exawu4dywshtpo9d6ecdmxzvzahpryiqu/edit?usp=sharing
提前谢谢。
编辑:所以我尝试了其他方法,这次我只将颜色列转换为虚拟值,并保持物种完整。代码如下:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
df = pd.read_excel('Iris_Dataset.xlsx')
df = df.dropna()
colour = pd.get_dummies(df.colour, drop_first = True)
df = pd.concat([df, colour], axis = 1)
df = df.drop(['colour'], axis = 1)
x = df.drop(["species"], axis = 1)
y = df.species
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 1)
model = LogisticRegression()
model.fit(x_train, y_train)
我这样做只是为了颜色,唯一的原因是当我在没有虚拟值的情况下尝试相同的方法时(我尝试将“物种”列作为一个整体传递,而不是我之前所做的),是因为我得到了错误: could not convert string to float: 'violet'
因此,在执行上述代码后,我得到了输出,但拟合过程在输出的同时给出了一条警告消息:
/usr/local/lib/python3.7/dist-packages/sklearn/linear_model/_logistic.py:940: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, l1_ratio=None, max_iter=100,
multi_class='auto', n_jobs=None, penalty='l2',
random_state=None, solver='lbfgs', tol=0.0001, verbose=0,
warm_start=False)
接下来的代码有点流畅,但是我想知道消息的含义,或者有什么方法可以避免它?
1条答案
按热度按时间ybzsozfc1#
您正在输入一个包含两列的 Dataframe
y
作为你的目标向量LogisticRegression.fit()
,这是不可能的。要求目标向量的形状(n_个样本,)为 Dataframe 术语中的sinlge列。以下是文档中的一个示例:
印刷品
y
你会看到它是一个一维数组。https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.logisticregression.html