2014-02-17 2 views
0

Logistic Regression을 실행 중이며 데이터에 대한 느낌을 얻기 위해 Learning Curve를 계획하고 싶습니다. 어떻게해야합니까? 여기에 지금까지 내 코드입니다 : 내가 만들고 싶은 것이로지스틱 회귀의 학습 곡선을 그래프로 표현하는 방법?

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.." 

이 같은 것입니다, 그래서 내가 무슨 일이 일어나고 있는지를 더 잘 이해 할 수 있습니다 :

Image of expected output

수있는 사람의 도움을 이걸로 제발?

답변

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 모델) 모델을합니다 (당신이 sklearn에 train_test_split 기능을 사용할 수 있습니다 기차/테스트 X와 Y의 배열이 생성), 및 채점 기능을 입력으로 사용하고 지수 적으로 간격을 둔 n 개의 하위 집합에 대해 데이터 집합 교육을 반복하고 "학습 곡선"을 반환합니다. 이 응답을 시각화하기위한 플로팅 기능도 있습니다.

예를 들어 cross_val_score를 사용하는 것이 좋겠지 만 이미 제공 한 테스트 점수 외에 교육용 점수를 다시 얻으려면 sklearn 소스를 수정해야합니다. prob 인수는 특정 모델/채점 함수 조합에 필요한 모델에서 predict_proba 대 predict 메소드를 사용할지 여부입니다. roc_auc_score. MNIST 데이터 집합의 부분 집합에

예 줄거리 : enter image description here

당신은 어떤 질문이 있으면 알려주세요!

관련 문제