当前位置: 首页 > 知识库问答 >
问题:

Python中的逻辑回归和交叉验证(使用sklearn)

葛承嗣
2023-03-14

我正试图通过逻辑回归来解决给定数据集上的分类问题(这不是问题)。为了避免过度拟合,我试图通过交叉验证来实现它(问题是这样的):在完成程序时,我遗漏了一些东西。我在这里的目的是确定准确性。

但让我具体一点。这就是我所做的:

  1. 我把集合分成训练集和测试集
  2. 我定义了要使用的对数回归预测模型
  3. 我用cross_val_predict法(sklearn.cross_validation)做预测
  4. 最后,我测量了精度

下面是代码:

import pandas as pd
import numpy as np
import seaborn as sns
from sklearn.cross_validation import train_test_split
from sklearn import metrics, cross_validation
from sklearn.linear_model import LogisticRegression

# read training data in pandas dataframe
data = pd.read_csv("./dataset.csv", delimiter=';')
# last column is target, store in array t
t = data['TARGET']
# list of features, including target
features = data.columns
# item feature matrix in X
X = data[features[:-1]].as_matrix()
# remove first column because it is not necessary in the analysis
X = np.delete(X,0,axis=1)
# divide in training and test set
X_train, X_test, t_train, t_test = train_test_split(X, t, test_size=0.2, random_state=0)

# define method
logreg=LogisticRegression()

# cross valitadion prediction
predicted = cross_validation.cross_val_predict(logreg, X_train, t_train, cv=10)
print(metrics.accuracy_score(t_train, predicted)) 

我的问题:

>

ValueError:发现样本数不一致的输入变量:[6016,4812]

其中6016是整个数据集中的样本数,4812是分割数据集后训练集中的样本数

在这之后,我不知道该怎么办。我的意思是:X_测试和t_测试什么时候起作用?我不知道交叉验证后应该如何使用它们,以及如何获得最终的准确性。

额外的问题:我还想在交叉验证的每个步骤中执行缩放和降维(通过特征选择或PCA)。我该怎么做?我已经看到定义管道有助于扩展,但我不知道如何将其应用于第二个问题。

我非常感谢您的帮助:-)

共有2个答案

傅翰池
2023-03-14

请查看scikit上的交叉验证文档以了解更多信息。

此外,您还错误地使用了cross\u val\u predict。它将在内部调用您提供的cvcv=10),以将提供的数据(即,在您的情况下为X_序列、t_序列)拆分为再次训练和测试,在训练中拟合估计器,并预测仍在测试中的数据。

现在,为了使用X_测试y_测试,您应该首先在列车数据上拟合您的估计器(cross_val_predict将不拟合),然后使用它预测测试数据,然后计算精度。

简单的代码片段来描述上面的内容(借用你的代码)(请阅读注释,如果不理解任何内容,请询问):

# item feature matrix in X
X = data[features[:-1]].as_matrix()
# remove first column because it is not necessary in the analysis
X = np.delete(X,0,axis=1)
# divide in training and test set
X_train, X_test, t_train, t_test = train_test_split(X, t, test_size=0.2, random_state=0)

# Until here everything is good
# You keep away 20% of data for testing (test_size=0.2)
# This test data should be unseen by any of the below methods

# define method
logreg=LogisticRegression()

# Ideally what you are doing here should be correct, until you did anything wrong in dataframe operations (which apparently has been solved)
#cross valitadion prediction
#This cross validation prediction will print the predicted values of 't_train'
predicted = cross_validation.cross_val_predict(logreg, X_train, t_train, cv=10)
# internal working of cross_val_predict:
  #1. Get the data and estimator (logreg, X_train, t_train)
  #2. From here on, we will use X_train as X_cv and t_train as t_cv (because cross_val_predict doesnt know that its our training data) - Doubts??
  #3. Split X_cv, t_cv into X_cv_train, X_cv_test, t_cv_train, t_cv_test by using its internal cv
  #4. Use X_cv_train, t_cv_train for fitting 'logreg' 
  #5. Predict on X_cv_test (No use of t_cv_test)
  #6. Repeat steps 3 to 5 repeatedly for cv=10 iterations, each time using different data for training and different data for testing.

# So here you are correctly comparing 'predicted' and 't_train'
print(metrics.accuracy_score(t_train, predicted)) 

# The above metrics will show you how our estimator 'logreg' works on 'X_train' data. If the accuracies are very high it may be because of overfitting.

# Now what to do about the X_test and t_test above.
# Actually the correct preference for metrics is this X_test and t_train
# If you are satisfied by the accuracies on the training data then you should fit the entire training data to the estimator and then predict on X_test

logreg.fit(X_train, t_train)
t_pred = logreg(X_test)

# Here is the final accuracy
print(metrics.accuracy_score(t_test, t_pred)) 
# If this accuracy is good, then your model is good.

如果您的数据较少或不想将数据拆分为培训和测试,那么您应该使用@fuzzyhedge建议的方法

# Use cross_val_score on your all data
scores = model_selection.cross_val_score(logreg, X, y, cv=10)

# 'cross_val_score' will almost work same from steps 1 to 4
  #5. t_cv_pred = logreg.predict(X_cv_test) and calculate accuracy with t_cv_test. 
  #6. Repeat steps 1 to 5 for cv_iterations = 10
  #7. Return array of accuracies calculated in step 5.

# Find out average of returned accuracies to see the model performance
scores = scores.mean()

注-交叉验证最好与gridsearch一起使用,以找出对给定数据表现最好的估计器参数。例如,使用Logistic回归,它定义了许多参数。但是如果你使用

logreg = LogisticRegression() 

将仅使用默认参数初始化模型。可能参数的值不同

logreg = LogisticRegression(penalty='l1', solver='liblinear') 

可能对您的数据性能更好。对更好参数的搜索是gridsearch。

现在至于你的第二部分缩放,尺寸减少等使用管道。您可以参考管道的留档和以下示例:

  • http://scikit-learn.org/stable/auto_examples/feature_stacker.html#sphx-glr自动示例功能堆垛机py

如果需要帮助,请随时与我联系。

谢财
2023-03-14

下面是在示例数据帧上测试的工作代码。代码中的第一个问题是目标数组不是np.array。您的功能中也不应该有目标数据。下面我将演示如何使用train_test_split手动拆分培训和测试数据。我还展示了如何使用包装器cross_val_评分来自动分割、拟合和评分。

random.seed(42)
# Create example df with alphabetic col names.
alphabet_cols = list(string.ascii_uppercase)[:26]
df = pd.DataFrame(np.random.randint(1000, size=(1000, 26)),
                  columns=alphabet_cols)
df['Target'] = df['A']
df.drop(['A'], axis=1, inplace=True)
print(df.head())
y = df.Target.values  # df['Target'] is not an np.array.
feature_cols = [i for i in list(df.columns) if i != 'Target']
X = df.ix[:, feature_cols].as_matrix()
# Illustrated here for manual splitting of training and testing data.
X_train, X_test, y_train, y_test = \
    model_selection.train_test_split(X, y, test_size=0.2, random_state=0)

# Initialize model.
logreg = linear_model.LinearRegression()

# Use cross_val_score to automatically split, fit, and score.
scores = model_selection.cross_val_score(logreg, X, y, cv=10)
print(scores)
print('average score: {}'.format(scores.mean()))

输出

     B    C    D    E    F    G    H    I    J    K   ...    Target
0   20   33  451    0  420  657  954  156  200  935   ...    253
1  427  533  801  183  894  822  303  623  455  668   ...    421
2  148  681  339  450  376  482  834   90   82  684   ...    903
3  289  612  472  105  515  845  752  389  532  306   ...    639
4  556  103  132  823  149  974  161  632  153  782   ...    347

[5 rows x 26 columns]
[-0.0367 -0.0874 -0.0094 -0.0469 -0.0279 -0.0694 -0.1002 -0.0399  0.0328
 -0.0409]
average score: -0.04258093018969249

有用的参考:

>

  • 从熊猫转换为Numpy
  • 选择所有数据框列的子集

    sklearn.model_selection.train_test_split

  •  类似资料:
    • 逻辑回归对应线性回归,但旨在解决分类问题,即将模型的输出转换为从 0 到 1 之间的概率值。逻辑回归直接对分类的可能性进行建模,无需事先假设数据的分布。 最理想的转换函数为单位阶跃函数(也称Heaviside函数),但单位阶跃函数是不连续的,没法在实际计算中使用。故而,在分类过程中更常使用对数几率函数(即sigmoid函数): $$f(x)=\frac{1}{1+e^{-x}}$$ 这样,模型就变

    • 问题内容: 我们需要使用Java进行逻辑回归。我们在Python http://blog.smellthedata.com/2009/06/python- logistic-regression- with-l2.html中 使用了此代码,并且基本上希望在Java中使用相同的代码。我被定向到Weka,但许可是非商业性的。 我发现Omegahat API具有像Scipy这样的BFGS最小化器,但我无

    • 本文向大家介绍python实现逻辑回归的示例,包括了python实现逻辑回归的示例的使用技巧和注意事项,需要的朋友参考一下 代码 以上就是python实现逻辑回归的示例的详细内容,更多关于python 逻辑回归的资料请关注呐喊教程其它相关文章!

    • 交叉验证 那么什么时候才需要交叉验证呢?交叉验证用在数据不是很充足的时候。比如在我日常项目里面,对于普通适中问题,如果数据样本量小于一万条,我们就会采用交叉验证来训练优化选择模型。如果样本大于一万条的话,我们一般随机的把数据分成三份,一份为训练集(Training Set),一份为验证集(Validation Set),最后一份为测试集(Test Set)。用训练集来训练模型,用验证集来评估模型预

    • 综述  “子非鱼,焉知鱼之乐” 本文采用编译器:jupyter  逻辑回归方法是从线性回归方法发展过来的,通常解决的是分类问题,读者或许有这样一个疑问:既然是回归算法又么解决分类问题的呢? 道理其实很简单,在我们求出线性回归系数a,b之后,对于每一个输入的x值,模型都可以输出对应的y值,如果把输出值y限制在0到1的范围内,那么这个y就非常的像一个概率p,我们只用规定概率的不同取值范围对应不同的标记

    • 问题内容: 给定开始日期和结束日期,我需要计算这两个日期之间的实例数。因此,给出以下内容: 桌子: 如果我在第一个(01/01)和第二个(02/01)之间看,我希望计数为2。如果我在寻找第3个到第4个,则期望计数为3。在整个日期范围内,那么我希望计数为4。有意义吗? 注意: 日期已转换为午夜,无需为此添加任何代码。此外,在整个问题中,日期均为dd / MM / yyyy格式。 目前,我有类似以下内