2017-07-05 16 views
11

मैं केरल में लिखे गए एक लॉजिस्टिक रजिस्ट्रार के परिणाम को डिफ़ॉल्ट स्केलेर्न लॉगेग में तुलना कर रहा हूं। मेरा इनपुट एक-आयामी है। मेरे आउटपुट में दो वर्ग हैं और मुझे संभावना है कि आउटपुट कक्षा 1 से संबंधित है।केरास और स्केलेर्न लॉग्रेग अलग-अलग परिणाम लौट रहे हैं

मुझे उम्मीद है कि परिणाम लगभग समान होने की उम्मीद कर रहे हैं, लेकिन वे भी करीब नहीं हैं।

यहां बताया गया है कि मैं अपना यादृच्छिक डेटा कैसे उत्पन्न करता हूं। ध्यान दें कि X_train, X_test अभी भी वैक्टर हैं, मैं सिर्फ पूंजी अक्षरों का उपयोग कर रहा हूं क्योंकि मुझे इसका उपयोग किया जाता है। इस मामले में स्केलिंग की कोई आवश्यकता नहीं है।

X = np.linspace(0, 1, 10000) 
y = np.random.sample(X.shape) 
y = np.where(y<X, 1, 0) 

यहां एक्स पर प्लॉट किए गए y का cumsum है। यहां एक प्रतिगमन करना रॉकेट विज्ञान नहीं है।

from sklearn.linear_model import LogisticRegression 
sk_lr = LogisticRegression() 
sk_lr.fit(X_train, y_train) 
sklearn_logreg_result = sk_lr.predict_proba(X_test)[:,1] 

और एक रसद regressor है कि मैं में लिखें:

X_train, X_test, y_train, y_test = train_test_split(X, y) 
X_train = X_train.reshape(-1,1) 
X_test = X_test.reshape(-1,1) 

इसके बाद, मैं एक डिफ़ॉल्ट रसद regressor प्रशिक्षित:

here's y plotted over x

मैं एक मानक ट्रेन परीक्षण विभाजित करना केरास:

from keras.models import Sequential 
from keras.layers import Dense 
keras_lr = Sequential() 
keras_lr.add(Dense(1, activation='sigmoid', input_dim=1)) 
keras_lr.compile(loss='mse', optimizer='sgd', metrics=['accuracy']) 
_ = keras_lr.fit(X_train, y_train, verbose=0) 
keras_lr_result = keras_lr.predict(X_test)[:,0] 

और एक हाथ से बनाई गई समाधान:

pearson_corr = np.corrcoef(X_train.reshape(X_train.shape[0],), y_train)[0,1] 
b = pearson_corr * np.std(y_train)/np.std(X_train) 
a = np.mean(y_train) - b * np.mean(X_train) 
handmade_result = (a + b * X_test)[:,0] 

मैं सभी तीन समान परिणाम देने के लिए उम्मीद है, लेकिन यहां क्या होता है। यह 100 डिब्बे का उपयोग कर एक विश्वसनीयता आरेख है।

enter image description here

मैं नुकसान कार्य करता है और अन्य मानकों के साथ चारों ओर खेल चुके हैं, लेकिन Keras logreg इस तरह मोटे तौर पर रहता है। समस्या क्या हो सकती है?

संपादित करें: इस साजिश द्वारा दिखाए गए अनुसार बाइनरी क्रॉसेंट्रॉपी का समाधान यहां समाधान नहीं है (ध्यान दें कि दो भूखंडों के बीच इनपुट डेटा बदल गया है)।

enter image description here

+0

क्या आप युगों की संख्या में वृद्धि करने की कोशिश कर सकते हैं? उदाहरण के लिए _ = keras_lr.fit (X_train, y_train, nb_epoch = 300 verbose = 0)। या _ = keras_lr.fit (X_train, y_train, epochs = 300 verbose = 0) यदि कैमरा 2 – maz

+0

का उपयोग करते हैं तो औसत पर sklearn समाधान 0.76 की सटीकता तक पहुंचता है। दस युग के बाद औसत तापमान 0.75 की सटीकता है। यह युग की बढ़ती संख्या के साथ सुधार नहीं करता है। – Darina

+0

@maz मैं उपर्युक्त टिप्पणी वापस लेता हूं। आप सही हैं, प्रदर्शन में सुधार होता है। ऐसा क्यों है कि लॉग्रेग को इतनी सरल सेटिंग में इतने सारे युग की जरूरत है? मुझे कोई अंतर्ज्ञान नहीं है। यदि आप युग-संख्या को उत्तर के रूप में रखते हैं, तो मैं इसे स्वीकार करूंगा। – Darina

उत्तर

1

दोनों कार्यान्वयन रसद प्रतिगमन का एक रूप है जबकि वहाँ काफी कुछ मतभेद है। जबकि दोनों समाधान तुलनीय न्यूनतम (0.75/0.76 एसीसी) में एकत्रित होते हैं, वे समान नहीं होते हैं।

  1. अनुकूलक - keras vanille SGD जहां sklearn के एलआर liblinear जो लागू करता trust region Newton method
  2. नियमितीकरण पर आधारित है का उपयोग करता है - sklearn एल 2 नियमितीकरण में बनाया गया है
  3. बाट -इस वजन बेतरतीब ढंग से प्रारंभ कर रहे हैं और शायद एक अलग से नमूना वितरण।
संबंधित मुद्दे