【问题标题】:How to graph Learning Curve of Logistic Regression?如何绘制逻辑回归的学习曲线?
【发布时间】:2014-03-16 05:02:48
【问题描述】:

我正在运行 Logistic 回归,并希望绘制其学习曲线以了解数据。我怎样才能做到这一点 ?到目前为止,这是我的代码:

 from sklearn import metrics,preprocessing,cross_validation
  from sklearn.feature_extraction.text import TfidfVectorizer
  import sklearn.linear_model as lm
  import pandas as p
  loadData = lambda f: np.genfromtxt(open(f,'r'), delimiter=' ')

  print "loading data.."
  traindata = list(np.array(p.read_table('train.tsv'))[:,2])
  testdata = list(np.array(p.read_table('test.tsv'))[:,2])
  y = np.array(p.read_table('train.tsv'))[:,-1]

  tfv = TfidfVectorizer(min_df=3,  max_features=None, strip_accents='unicode',  
        analyzer='word',token_pattern=r'\w{1,}',ngram_range=(1, 2), use_idf=1,smooth_idf=1,sublinear_tf=1)

  rd = lm.LogisticRegression(penalty='l2', dual=True, tol=0.0001, 
                             C=1, fit_intercept=True, intercept_scaling=1.0, 
                             class_weight=None, random_state=None)

  X_all = traindata + testdata
  lentrain = len(traindata)

  print "fitting pipeline"
  tfv.fit(X_all)
  print "transforming data"
  X_all = tfv.transform(X_all)

  X = X_all[:lentrain]
  X_test = X_all[lentrain:]

  print "20 Fold CV Score: ", np.mean(cross_validation.cross_val_score(rd, X, y, cv=20, scoring='roc_auc'))

  print "training on full data"
  rd.fit(X,y)
  pred = rd.predict_proba(X_test)[:,1]
  testfile = p.read_csv('test.tsv', sep="\t", na_values=['?'], index_col=1)
  pred_df = p.DataFrame(pred, index=testfile.index, columns=['label'])
  pred_df.to_csv('benchmark.csv')
  print "submission file created.."

我想创造的是这样的东西,所以我可以更好地了解正在发生的事情:

谁能帮我解决这个问题?

【问题讨论】:

    标签: python python-2.7 graph matplotlib scikit-learn


    【解决方案1】:

    不像它应该的那样通用,但它会在你的末端稍微摆弄一下。

    from matplotlib import pyplot as plt
    from sklearn import metrics
    import numpy as np
    
    def data_size_response(model,trX,teX,trY,teY,score_func,prob=True,n_subsets=20):
    
        train_errs,test_errs = [],[]
        subset_sizes = np.exp(np.linspace(3,np.log(trX.shape[0]),n_subsets)).astype(int)
    
        for m in subset_sizes:
            model.fit(trX[:m],trY[:m])
            if prob:
                train_err = score_func(trY[:m],model.predict_proba(trX[:m]))
                test_err = score_func(teY,model.predict_proba(teX))
            else:
                train_err = score_func(trY[:m],model.predict(trX[:m]))
                test_err = score_func(teY,model.predict(teX))
            print "training error: %.3f test error: %.3f subset size: %.3f" % (train_err,test_err,m)
            train_errs.append(train_err)
            test_errs.append(test_err)
    
        return subset_sizes,train_errs,test_errs
    
    def plot_response(subset_sizes,train_errs,test_errs):
    
        plt.plot(subset_sizes,train_errs,lw=2)
        plt.plot(subset_sizes,test_errs,lw=2)
        plt.legend(['Training Error','Test Error'])
        plt.xscale('log')
        plt.xlabel('Dataset size')
        plt.ylabel('Error')
        plt.title('Model response to dataset size')
        plt.show()
    
    model = # put your model here
    score_func = # put your scoring function here
    response = data_size_response(model,trX,teX,trY,teY,score_func,prob=True)
    plot_response(*response)
    

    data_size_response 函数采用模型(在您的情况下为实例化的 LR 模型)、预拆分数据集(训练/测试 X 和 Y 数组,您可以使用 sklearn 中的 train_test_split 函数来生成它)和评分函数输入并在 n 个指数间隔子集上迭代您的数据集训练并返回“学习曲线”。还有一个绘图函数用于可视化此响应。

    我希望像您的示例一样使用 cross_val_score,但除了它已经提供的测试分数之外,它还需要修改 sklearn 源以获取训练分数。 prob 参数是是否在模型上使用 predict_proba vs predict 方法,这对于某些模型/评分函数组合是必要的,例如roc_auc_score.

    MNIST 数据集子集上的示例图:

    如果您有任何问题,请告诉我!

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 2016-08-09
      • 2015-10-09
      • 2020-06-13
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多