Scikit-learn: تنفيذ GridSearchCV بالتوازي مع تجميد المسجل الخاص

تم إنشاؤها على ٢٤ فبراير ٢٠١٤  ·  99تعليقات  ·  مصدر: scikit-learn/scikit-learn

لقد كنت أبحث عن ساعات حول هذه المشكلة ويمكنني تكرارها باستمرار:

clf = GridSearchCV( sk.LogisticRegression(),
                            tuned_parameters,
                            cv = N_folds_validation,
                            pre_dispatch='6*n_jobs', 
                            n_jobs=4,
                            verbose = 1,
                            scoring=metrics.make_scorer(metrics.scorer.f1_score, average="macro")
                        )

يتعطل هذا المقتطف بسبب تسجيل النقاط = metrics.make_scorer (metrics.scorer.f1_score، average = "macro") حيث تشير المقاييس إلى وحدة sklearn.metrics. إذا قمت بإلغاء التسجيل = ... سطر ، يعمل التنفيذ المتوازي. إذا كنت أرغب في استخدام درجة f1 كطريقة تقييم ، فلا بد لي من إلغاء التنفيذ المتوازي عن طريق تعيين n_jobs = 1.

هل هناك طريقة يمكنني من خلالها تحديد طريقة نقاط أخرى دون فقدان إمكانية التنفيذ الموازي؟

شكرا

التعليق الأكثر فائدة

همهمة ، من المحتمل أن يكون ذلك مرتبطًا بقضايا المعالجة المتعددة على النوافذ. ربما يمكن أن يساعد GaelVaroquaux أو ogrisel .
لا أعرف ما الذي يجعل دفتر الملاحظات من __name__ == "__main__" .
حاول ألا تحدد المقياس في دفتر الملاحظات ، ولكن في ملف منفصل وقم باستيراده. أعتقد أن هذا سيصلحها.
لا يتعلق هذا حقًا بـ GridSearchCV ، ولكن هناك بعض التفاعلات المثيرة للاهتمام بين Windows متعدد المعالجات ، دفتر IPython و joblib.

ال 99 كومينتر

هذا أمر مفاجئ ، لذا سيتعين علينا تحديد المشكلة والتأكد من أنها تعمل!

هل يمكنك تقديم المزيد من التفاصيل من فضلك:

  • ماذا تقصد ب "حوادث"؟
  • ما هو إصدار scikit-Learn هذا؟ إذا كان 0.14 ، فهل ما زال يحدث في إصدار التطوير الحالي؟
  • المعالجة المتعددة لها مشكلات خاصة بالنظام الأساسي. اي الانظمة الاساسية تعتمد؟ (على سبيل المثال ، import platform; platform.platform() )
  • هل جربته على مجموعات بيانات مختلفة؟

FWIW ، لا يواجه جهازي مشكلة في تركيب قزحية العين بهذا المقتطف في إصدار التطوير من sklearn.

شكرا لك على الرد السريع الخاصة بك.

مع التحطم أعني التجميد في الواقع. لم يعد يستمر ولم يعد هناك نشاط آخر يمكن مراقبته في عملية Python لمدير المهام في windows. العمليات لا تزال موجودة وتستهلك كمية ثابتة من ذاكرة الوصول العشوائي ولكنها لا تتطلب وقت معالجة.

هذا هو الإصدار 0.14 من scikit-Learn ، تم تحديثه مؤخرًا وتشغيله باستخدام En Thinkt Canopy.

أنا على منصة "Windows-7-6.1.7601-SP1".

سوف أتعمق أكثر بتقديم مثال عام للمشكلة. أعتقد أن الأمر يتعلق بوضع GridSearchCV في حلقة for. (حتى لا تضيع الكثير من وقتك ، يجب أن تبدأ على الأرجح بطريقة run_tune_process () التي يتم استدعاؤها في الجزء السفلي من الكود وتستدعي الطريقة التي تحتوي على GridSearchCV () في حلقة for)

الشفرة:

import sklearn.metrics as metrics
from sklearn.grid_search import GridSearchCV
import numpy as np
import os
from sklearn import datasets
from sklearn import svm as sk


def tune_hyperparameters(trainingData, period):
    allDataTrain = trainingData

    # Define hyperparameters and construct a dictionary of them
    amount_kernels = 2
    kernels = ['rbf','linear']
    gamma_range =   10. ** np.arange(-5, 5)
    C_range =       10. ** np.arange(-5, 5)
    tuned_parameters = [
                        {'kernel': ['rbf'],     'gamma': gamma_range , 'C': C_range},
                        {'kernel': ['linear'],  'C': C_range}
                       ]

    print("Tuning hyper-parameters on period = " + str(period) + "\n")

    clf = GridSearchCV( sk.SVC(), 
                        tuned_parameters,
                        cv=5,
                        pre_dispatch='4*n_jobs', 
                        n_jobs=2,
                        verbose = 1,
                        scoring=metrics.make_scorer(metrics.scorer.f1_score, average="macro")
                        )
    clf.fit(allDataTrain[:,1:], allDataTrain[:,0:1].ravel())

    # other code will output some data to files, graphs and will save the optimal model with joblib package


    #   Eventually we will return the optimal model
    return clf

def run_tune_process(hyperparam_tuning_method,trainingData, testData):    
    for period in np.arange(0,100,10):
                clf = hyperparam_tuning_method(trainingData,period)

                y_real = testData[:,0:1].ravel()
                y_pred = clf.predict(testData[:,1:])

# import some data to play with
iris = datasets.load_iris()
X_training = iris.data[0:100,:]  
Y_training = (iris.target[0:100]).reshape(100,1)
trainingset = np.hstack((Y_training, X_training))

X_test = iris.data[100:150,:]  
Y_test = (iris.target[100:150]).reshape(50,1)
testset = np.hstack((Y_test, X_test))

run_tune_process(tune_hyperparameters,trainingset,testset)

مرة أخرى ، يعمل هذا الرمز على جهاز الكمبيوتر الخاص بي فقط عندما أقوم بتغيير n_jobs إلى 1 أو عندما لا أحدد درجة = وسيطة.

بشكل عام ، تواجه المعالجة المتعددة في Windows الكثير من المشاكل. لكن أنا
لا أعرف سبب ارتباط ذلك بمقياس مخصص. هناك
لا شيء عن متوسط ​​\ u200b \ u200b خيار الماكرو في 0.14 يشير إلى أنه يجب أن يكون كذلك
أكثر عرضة للتعليق من المتوسط ​​الافتراضي (المرجح). في التطوير
head ، يكتمل هذا في 11 ثانية على جهاز macbook الخاص بي ، وفي 7 ثوانٍ في الإصدار 0.14
(هذا شيء يجب النظر فيه!)

هل يمكنك تجربة ذلك في إصدار التطوير الحالي لمعرفة ما إذا كان
لا تزال مشكلة؟

في 25 فبراير 2014 20:40 ، كتب adverley [email protected] :

شكرا لك على الرد السريع الخاصة بك.

مع التحطم أعني التجميد في الواقع. لم يعد يستمر و
لا يوجد نشاط آخر يجب مراقبته في عملية بيثون
مدير مهام الويندوز. العمليات لا تزال موجودة وتستهلك أ
كمية ثابتة من ذاكرة الوصول العشوائي (RAM) ولكنها لا تتطلب وقت معالجة.

هذا هو الإصدار 0.14 من scikit-Learn ، تم تحديثه مؤخرًا وتشغيله باستخدام En Thinkt
ظلة.

أنا على منصة "Windows-7-6.1.7601-SP1".

سوف أتعمق أكثر بتقديم مثال عام للمشكلة. أنا
أعتقد أن الأمر يتعلق بوضع GridSearchCV في حلقة for. (إلى
لا تضيع الكثير من وقتك ، فمن المحتمل أن تبدأ في
طريقة () run_tune_process التي يتم استدعاؤها في الجزء السفلي من الكود
ويستدعي الطريقة التي تحتوي على GridSearchCV () في حلقة for)
الشفرة:

استيراد sklearn.metrics كمقاييس
من sklearn.grid_search استيراد GridSearchCV
استيراد numpy كـ np
استيراد نظام التشغيل
من sklearn استيراد مجموعات البيانات
من sklearn import svm as sk

def tune_hyperparameters (بيانات التدريب ، الفترة):
allDataTrain = trainingData

# Define hyperparameters and construct a dictionary of them
amount_kernels = 2
kernels = ['rbf','linear']
gamma_range =   10. ** np.arange(-5, 5)
C_range =       10. ** np.arange(-5, 5)
tuned_parameters = [
                    {'kernel': ['rbf'],     'gamma': gamma_range , 'C': C_range},
                    {'kernel': ['linear'],  'C': C_range}
                   ]

print("Tuning hyper-parameters on period = " + str(period) + "\n")

clf = GridSearchCV( sk.SVC(),
                    tuned_parameters,
                    cv=5,
                    pre_dispatch='4*n_jobs',
                    n_jobs=2,
                    verbose = 1,
                    scoring=metrics.make_scorer(metrics.scorer.f1_score, average="macro")
                    )
clf.fit(allDataTrain[:,1:], allDataTrain[:,0:1].ravel())

# other code will output some data to files, graphs and will save the optimal model with joblib package


#   Eventually we will return the optimal model
return clf

def run_tune_process (hyperparam_tuning_method، trainingData، testData):
للفترة في np.arange (0،100،10):
clf = hyperparam_tuning_method (بيانات التدريب ، فترة)

            y_real = testData[:,0:1].ravel()
            y_pred = clf.predict(testData[:,1:])

استيراد بعض البيانات للعب بها

iris = datasets.load_iris ()
X_training = iris.data [0: 100 ،:]
Y_training = (iris.target [0: 100]). إعادة تشكيل (100،1)
مجموعة تدريب = np.hstack ((Y_training، X_training))

X_test = iris.data [100: 150 ،:]
Y_test = (iris.target [100: 150]). إعادة تشكيل (50،1)
testet = np.hstack ((Y_test، X_test))

run_tune_process (tune_hyperparameters ، مجموعة التدريب ، مجموعة الاختبارات)

قم بالرد على هذه الرسالة الإلكترونية مباشرة أو tHubhttps: //github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -35990430
.

(كنقطة جانبية ، ogrisel ، ألاحظ أنه يبدو أن هناك الكثير من كتاب الوظائف
موازاة النفقات العامة الرئيسية - على OS X على الأقل - لم يكن ذلك موجودًا
في 0.14 ...)

في 25 فبراير 2014 21:52 ، جويل نوثمان [email protected] :

بشكل عام ، تواجه المعالجة المتعددة في Windows الكثير من المشاكل. لكن أنا
لا أعرف سبب ارتباط ذلك بمقياس مخصص. هناك
لا شيء عن متوسط ​​\ u200b \ u200b خيار الماكرو في 0.14 يشير إلى أنه يجب أن يكون كذلك
أكثر عرضة للتعليق من المتوسط ​​الافتراضي (المرجح). في التطوير
head ، يكتمل هذا في 11 ثانية على جهاز macbook الخاص بي ، وفي 7 ثوانٍ في الإصدار 0.14
(هذا شيء يجب النظر فيه!)

هل يمكنك تجربة ذلك في إصدار التطوير الحالي لمعرفة ما إذا كان
لا تزال مشكلة؟

في 25 فبراير 2014 20:40 ، كتب adverley [email protected] :

شكرا لك على الرد السريع الخاصة بك.

مع التحطم أعني التجميد في الواقع. لم يعد يستمر و
لا يوجد نشاط آخر يجب مراقبته في عملية بيثون
مدير مهام الويندوز. العمليات لا تزال موجودة وتستهلك أ
كمية ثابتة من ذاكرة الوصول العشوائي (RAM) ولكنها لا تتطلب وقت معالجة.

هذا هو الإصدار 0.14 من scikit-Learn ، تم تحديثه مؤخرًا وتشغيله باستخدام En Thinkt
ظلة.

أنا على منصة "Windows-7-6.1.7601-SP1".

سوف أتعمق أكثر بتقديم مثال عام للمشكلة.
أعتقد أن الأمر يتعلق بوضع GridSearchCV في حلقة for. (إلى
لا تضيع الكثير من وقتك ، فمن المحتمل أن تبدأ في
طريقة () run_tune_process التي يتم استدعاؤها في الجزء السفلي من الكود
ويستدعي الطريقة التي تحتوي على GridSearchCV () في حلقة for)
الشفرة:

استيراد sklearn.metrics كمقاييس
من sklearn.grid_search استيراد GridSearchCV
استيراد numpy كـ np
استيراد نظام التشغيل
من sklearn استيراد مجموعات البيانات
من sklearn import svm as sk

def tune_hyperparameters (بيانات التدريب ، الفترة):
allDataTrain = trainingData

# Define hyperparameters and construct a dictionary of them
amount_kernels = 2
kernels = ['rbf','linear']
gamma_range =   10. ** np.arange(-5, 5)
C_range =       10. ** np.arange(-5, 5)
tuned_parameters = [
                    {'kernel': ['rbf'],     'gamma': gamma_range , 'C': C_range},
                    {'kernel': ['linear'],  'C': C_range}
                   ]

print("Tuning hyper-parameters on period = " + str(period) + "\n")

clf = GridSearchCV( sk.SVC(),
                    tuned_parameters,
                    cv=5,
                    pre_dispatch='4*n_jobs',
                    n_jobs=2,
                    verbose = 1,
                    scoring=metrics.make_scorer(metrics.scorer.f1_score, average="macro")
                    )
clf.fit(allDataTrain[:,1:], allDataTrain[:,0:1].ravel())

# other code will output some data to files, graphs and will save the optimal model with joblib package


#   Eventually we will return the optimal model
return clf

def run_tune_process (hyperparam_tuning_method، trainingData، testData):
للفترة في np.arange (0،100،10):
clf = hyperparam_tuning_method (بيانات التدريب ، فترة)

            y_real = testData[:,0:1].ravel()
            y_pred = clf.predict(testData[:,1:])

استيراد بعض البيانات للعب بها

iris = datasets.load_iris ()
X_training = iris.data [0: 100 ،:]
Y_training = (iris.target [0: 100]). إعادة تشكيل (100،1)
مجموعة تدريب = np.hstack ((Y_training، X_training))

X_test = iris.data [100: 150 ،:]
Y_test = (iris.target [100: 150]). إعادة تشكيل (50،1)
testet = np.hstack ((Y_test، X_test))

run_tune_process (tune_hyperparameters ، مجموعة التدريب ، مجموعة الاختبارات)

قم بالرد على هذه الرسالة الإلكترونية مباشرة أو tHubhttps: //github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -35990430
.

هذا ليس له علاقة مع المصححين المخصصين. هذه ميزة معروفة لمعالجات Python المتعددة على Windows: عليك تشغيل كل شيء يستخدم n_jobs=-1 في كتلة if __name__ == '__main__' أو ستصاب بالتجمد / الأعطال. ربما ينبغي علينا توثيق هذا في مكان ما بشكل بارز ، على سبيل المثال في README؟

يجب عليك تشغيل كل شيء يستخدم n_jobs = -1 في اسم if ==
كتلة " رئيسية " أو ستحصل على تجميد / أعطال.

حسنًا ، الخبر السار هو أن إعلان العمل في الوقت الحاضر يعطي خطأً ذا مغزى
رسالة في مثل هذا الحادث ، بدلا من شوكة القنبلة.

GaelVaroquaux هل يعطي scikit-Learn الحالي رسالة الخطأ هذه؟ إذا كان الأمر كذلك ، يمكن اعتبار المشكلة ثابتة ، IMHO.

GaelVaroquaux هل يعطي scikit-Learn الحالي رسالة الخطأ هذه؟ إذا كان الأمر كذلك ، فإن ملف
يمكن اعتبار المشكلة ثابتة ، IMHO.

يجب أن تفعل. الطريقة الوحيدة للتأكد هي التحقق. أنا في التحرك الصحيح
الآن ، ولا يمكنني تشغيل جهاز Windows VM للقيام بذلك.

لن أقوم بتثبيت مترجم C على Windows لهذا الغرض فقط. آسف ، لكنني لا أفعل Windows حقًا :)

لن أقوم بتثبيت مترجم C على Windows لهذا الغرض فقط. آسف ولكنني
حقا لا تفعل ويندوز :)

لدي جهاز Windows VM. أستطيع أن تحقق. إنها مجرد مسألة إيجاد ملف
القليل من الوقت للقيام بذلك.

@ larsmans ، أنت محق تمامًا. كان كائن المسجل المخصص خطأ مني ، والمشكلة تكمن بالفعل في المعالجة المتعددة على النوافذ. لقد جربت هذا الرمز نفسه على Linux وهو يعمل بشكل جيد.

لا أحصل على أي رسائل خطأ لأنها لا تتعطل ، إنها تتوقف عن فعل أي شيء مفيد.

adverley هل يمكنك تجربة أحدث إصدار من GitHub على جهاز Windows الخاص بك؟

يتم الإغلاق بسبب عدم وجود رسوم مرتجعة وربما تكون مشكلة معروفة تم إصلاحها في قائمة الوظائف الأحدث.

لست متأكدًا مما إذا كان مرتبطًا ، يبدو أنه كذلك.

في النوافذ ، لا يزال المحرر المخصص يتجمد. لقد واجهت هذا الموضوع على google - تمت إزالة المسجل ، ويعمل بحث الشبكة.

عندما يتجمد ، فإنه لا يظهر أي رسالة خطأ. هناك 3 عمليات للبيثون تم إنتاجها أيضًا (لأنني قمت بتعيين n_jobs = 3). ومع ذلك ، يظل استخدام وحدة المعالجة المركزية 0 لجميع عمليات بيثون. أنا أستخدم IPython Notebook.

هل يمكنك مشاركة رمز المسجل؟ يبدو قليلا غير مرجح.

هل يستخدم المسجل الخاص بك Joblib / n_jobs في أي مكان؟ لا ينبغي ذلك ، وقد يتسبب ذلك في حدوث مشكلات (على الرغم من أنني أعتقد أن كتاب العمل يجب أن يكتشف ذلك).

بالتأكيد - إليك الكود الكامل - http://pastebin.com/yUE26SNs

وظيفة المسجل هي "Score_model" ، ولا تستخدم Joblib.

يتم تشغيل هذا من موجه الأوامر ، ولكن ليس من IPython Notebook. رسالة الخطأ -
AttributeError: Can't get attribute 'score_model' on <module '__main__' (built-in)>;

ثم يصبح IPython وجميع مثيلات python التي تم إنتاجها خاملة - بصمت - ولا تستجيب لأي كود Python بعد الآن حتى أقوم بإعادة تشغيله.

أصلح خطأ السمة ، ثم سيعمل.
هل تقومون باستيراد pylab في دفتر IPython؟ وإلا يجب أن يكون كل شيء هو نفسه.

حسنًا ، لا أعرف ما الذي يسبب خطأ AttributeError ... على الرغم من أنه من المحتمل أن يكون مرتبطًا ببيانات الوظائف ، نظرًا لأن _ يحدث فقط عندما تكون n_jobs أكثر من 1_ ، تعمل بشكل جيد مع n_jobs=1 .

يتحدث الخطأ عن السمة score_model مفقودة من __main__ ، سواء كان لدي if __name__ == '__main__' في IPython أم لا.

(لقد أدركت أنه تم لصق سطر الخطأ بشكل غير صحيح أعلاه - لقد قمت بتحريره في المنشور أعلاه.)

أنا لا أستخدم pylab.

إليك رسالة الخطأ الموسعة الكاملة - http://pastebin.com/23y5uHT2

همهمة ، من المحتمل أن يكون ذلك مرتبطًا بقضايا المعالجة المتعددة على النوافذ. ربما يمكن أن يساعد GaelVaroquaux أو ogrisel .
لا أعرف ما الذي يجعل دفتر الملاحظات من __name__ == "__main__" .
حاول ألا تحدد المقياس في دفتر الملاحظات ، ولكن في ملف منفصل وقم باستيراده. أعتقد أن هذا سيصلحها.
لا يتعلق هذا حقًا بـ GridSearchCV ، ولكن هناك بعض التفاعلات المثيرة للاهتمام بين Windows متعدد المعالجات ، دفتر IPython و joblib.

رفاق ... شكرا على الموضوع. على أي حال ، كان يجب أن أتحقق من هذا الموضوع من قبل ، وأهدرت 5 ساعات من وقتي في هذا. تحاول أن تعمل في معالجة موازية. شكرا جزيلا :)
لإضافة تقييم: لا يزال متجمدًا. لقد واجهت نفس المشكلة عندما كنت في وجود وظيفة تكلفة make_Score الخاصة بي .. يبدأ نظامي في التجميد. عندما لم أستخدم وظيفة التكلفة المخصصة ، لم أواجه هذا التجمد في المعالجة المتوازية

أفضل طريقة لتحويل هذه الساعات الخمس إلى شيء مفيد للمشروع ، هي تزويدنا بمثال قائم بذاته لإعادة إنتاج المشكلة.

كنت أواجه نفس المشكلة على نظام التشغيل Windows 10 الذي يعمل في دفتر Jupyter أثناء محاولة استخدام أداة تسجيل مخصصة ضمن عملية تحقق متداخلة متداخلة و n_jobs = -1. كنت أتلقى الرسالة AttributeError: Can't get attribute 'custom_scorer' on <module '__main__' (built-in)>; .
كما اقترح amueller ، فإن استيراد أداة التسجيل المخصصة بدلاً من تحديدها في دفتر الملاحظات يعمل.

لدي نفس المشكلة بالضبط في OSX 10.10.5

كذلك هنا.
OSX 10.12.5

يرجى تقديم مقتطف رمز قابل لإعادة الإنتاج. نود أن نصل إلى الجزء السفلي من هذا. من الصعب أن نفهم بدون رمز ، بما في ذلك البيانات ، التي توضح لنا المشكلة.

فقط قم بتشغيل هذه الخطوط في صدفة بيثون

import numpy as np
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.preprocessing import RobustScaler
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_predict

np.random.seed(1234)
X = np.random.sample((1000, 100))
Y = np.random.sample((1000)) > 0.5
svc_pipeline = Pipeline([('pca', PCA(n_components=95)), ('svc', SVC())])
predictions = cross_val_predict(svc_pipeline, X, Y, cv=30, n_jobs=-1)
print classification_report(Y, predictions)

لاحظ أن إزالة خطوة PCA من خط الأنابيب يحل المشكلة.

مزيد من المعلومات:

داروين -16.6.0-x86_64-i386-64 بت
('Python'، '2.7.13 (افتراضي ، 4 أبريل 2017 ، 08:47:57) \ n [GCC 4.2.1 متوافق مع Apple LLVM 8.1.0 (clang-802.0.38)]')
("NumPy"، "1.12.1")
("SciPy"، "0.19.1")
("Scikit-Learn"، "0.18.2")

نظرًا لأنك لا تستخدم أداة تسجيل مخصصة ، إذا افترضنا أن هذا هو ملف
قضية منفصلة؟

في 8 أغسطس 2017 6:15 مساءً ، كتب "boazsh" [email protected] :

فقط قم بتشغيل هذه الخطوط في صدفة بيثون

من sklearn.decomposition ، استيراد PCA من sklearn.svm ، استيراد SVC من sklearn.preprocessing استيراد RobustScaler من sklearn.metrics استيراد تصنيف_ تقرير من sklearn.pipeline استيراد خط الأنابيب من sklearn.model_selection استيراد cross_val_predict

X = np.random.sample ((1000 ، 100))
Y = np.random.sample ((1000))> 0.5
svc_pipeline = خط أنابيب ([('pca'، PCA (n_components = 95))، ('svc'، SVC ())])
التنبؤات = cross_val_predict (svc_pipeline ، X ، Y ، cv = 30 ، n_jobs = -1) تقرير تصنيف الطباعة (Y ، التنبؤات)

لاحظ أن إزالة خطوة PCA من خط الأنابيب يحل المشكلة.

مزيد من المعلومات:

scikit-Learn == 0.18.2
scipy == 0.19.1
numpy == 1.12.1

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320885103 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AAEz6-6Klhc67b5kZ17fFTxc8RfZQ_BWks5sWBkLgaJpZM4BkiD9
.

عندما واجهت هذه المشكلة لأول مرة كنت أستخدم أداة تسجيل مخصصة ، ولكن أثناء محاولة تبسيط رمز المثال قدر الإمكان ، وجدت أنه ليس بالضرورة أن يحتوي على أداة تسجيل مخصصة. على الأقل على جهازي. لم يساعد استيراد المسجل أيضًا في حالتي. على أي حال ، فإن الأعراض تبدو متشابهة. يتوقف النص إلى الأبد واستخدام وحدة المعالجة المركزية منخفض.

boazsh شكرًا جزيلاً على المقتطف ، فهو ليس np.random.RandomState للتأكد من أن الأرقام العشوائية هي نفسها دائمًا في كل تشغيل.

يوجد أيضًا حل بديل إذا كنت تستخدم Python 3 المقترحة على سبيل المثال في https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment -187683383.

ليس لدي طريقة لاختبار ذلك على OSX في الوقت الحالي ولكن قد أتمكن من المحاولة في الأيام القادمة.

بعض المعلومات المفيدة في الحصول عليها (فقط أضف ما هو مفقود إلى تعليقك السابق https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320885103):

import platform; print(platform.platform())
import sys; print("Python", sys.version)
import numpy; print("NumPy", numpy.__version__)
import scipy; print("SciPy", scipy.__version__)
import sklearn; print("Scikit-Learn", sklearn.__version__)

أيضًا كيف قمت بتثبيت scikit-learn ، مع pip ، مع conda ، مع أحد مديري حزم OSX (تخمير ، إلخ ...)؟

تم تحديث المقتطف (مستخدم np.random.seed)

داروين -16.6.0-x86_64-i386-64 بت
('Python'، '2.7.13 (افتراضي ، 4 أبريل 2017 ، 08:47:57) \ n [GCC 4.2.1 متوافق مع Apple LLVM 8.1.0 (clang-802.0.38)]')
("NumPy"، "1.12.1")
("SciPy"، "0.19.1")
("Scikit-Learn"، "0.18.2")

تم تحديث المقتطف (مستخدم np.random.seed)

شكرا جزيلا!

أيضًا كيف قمت بتثبيت scikit-learn ، مع pip ، مع conda ، مع أحد مديري حزم OSX (تخمير ، إلخ ...)؟

هل أجبت على هذا السؤال ، لا يمكنني العثور على إجابتك ...

آسف ، فاتها - بيب.

FWIW ، ليس لدي مشكلة في تشغيل هذا المقتطف مع:

منصة استيراد طباعة (platform.platform ())
داروين -16.7.0-x86_64-i386-64 بت
نظام الاستيراد طباعة ("Python" ، sys.version)
Python 2.7.12 | Continuum Analytics، Inc. | (افتراضي ، 2 تموز (يوليو) 2016 ، 17:43:17)
[GCC 4.2.1 (بناءً على إصدار شركة Apple Inc. 5658) (إصدار LLVM 2336.11.00)]
استيراد numpy طباعة ("NumPy" ، numpy .__ الإصدار__)
NumPy 1.13.1
استيراد scipy طباعة ("SciPy" ، scipy .__ نسخة _)
SciPy 0.19.1.0 تحديث
استيراد sklearn طباعة ("Scikit-Learn" ، sklearn .__ الإصدار__)
Scikit-Learn 0.18.2.0 تحديث

هل يمكنك وضع verbose = 10 في cross_val_predict أيضًا ، حتى نتمكن من ذلك
ترى أين ينكسر بالنسبة لك؟

في 8 أغسطس 2017 الساعة 22:59 ، كتب boazsh [email protected] :

آسف ، فاتها - بيب.

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320948362 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AAEz67S64KIXUGvARGjvxBOw_4aCAdqhks5sWFu0gaJpZM4BkiD9
.

jnothman أظن أن بيئة تسرع . مشكلة التجميد هذه خاصة بالمعالجة المتعددة لـ Accelerate و Python. http://scikit-learn.org/stable/faq.html#why -do-i-Someime-get-a-crash-freeze-with-n-jobs-1-under-osx-or-linux لمزيد من التفاصيل .

من ناحية أخرى ، ستستخدم النقطة العجلات التي يتم شحنها مع Accelerate (في وقت كتابة هذا التقرير).

الحل البديل (بخلاف JOBLIB_START_METHOD) لتجنب هذا الخطأ المحدد هو استخدام MKL (على سبيل المثال عبر conda) أو OpenBLAS (على سبيل المثال عبر قناة conda-forge).

لا شيء يتم طباعته ...

screen shot 2017-08-08 at 16 43 35

jnothman أظن أن بيئة تسرع .

jnothman في حال كنت ترغب في إعادة إنتاج المشكلة ، يمكنك إنشاء بيئة مع تسريع على OSX مع IIRC مع شيء مثل:

conda create -n test-env python=3 nomkl scikit-learn ipython

FWIW لا يمكنني إعادة إنتاج المشكلة على جهاز OS X VM. حاولت تقليد إصدارات boazsh قدر الإمكان:

Darwin-16.1.0-x86_64-i386-64bit
('Python', '2.7.13 |Continuum Analytics, Inc.| (default, Dec 20 2016, 23:05:08) \n[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]')
('NumPy', '1.12.1')
('SciPy', '0.19.1')
('Scikit-Learn', '0.18.2')

حسنًا ، يمكنني في الواقع التكاثر ولكن مقتطفك لم يكن أداة إعادة إنتاج كاملة. هنا مقتطف محدث:

import numpy as np
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.preprocessing import RobustScaler
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_predict

np.random.seed(1234)
X = np.random.sample((1000, 100))
Y = np.random.sample((1000)) > 0.5
svc_pipeline = Pipeline([('pca', PCA(n_components=95)), ('svc', SVC())])
PCA(n_components=95).fit(X, Y) # this line is required to reproduce the freeze
predictions = cross_val_predict(svc_pipeline, X, Y, cv=30, n_jobs=-1)
print(classification_report(Y, predictions))

على أي حال ، هذه مشكلة معروفة في المعالجات المتعددة Accelerate و Python. توجد حلول بديلة وقد تم إدراجها في المشاركات السابقة. أسهل طريقة هي استخدام conda والتأكد من استخدام MKL وليس Accelerate.

على المدى الطويل (ربما scikit-Learn 0.20) ، سيتم حل هذه المشكلة عالميًا من خلال الواجهة الخلفية الجديدة لـ joblib: https://github.com/scikit-learn/scikit-learn/issues/7650

يعد وجود إصلاح للمعالجة المتعددة يعتمد على إصدار scikit-Learn من أعراض مشاكل البيع ....

يعد وجود إصلاح للمعالجة المتعددة يعتمد على إصدار scikit-Learn من أعراض مشاكل البيع ....

لقد قرأت مؤخرًا ما يلي ، والذي وجدته مثيرًا للاهتمام:
https://lwn.net/Articles/730630/rss

لدي مشكلة مماثلة مع RandomizedSearchCV ؛ انها معلقة إلى أجل غير مسمى. أنا أستخدم macbook pro البالغ من العمر 3 سنوات وذاكرة الوصول العشوائي 16 جيجابايت و Core i7 وإصدار scikit-Learn الخاص بي هو 0.19.

المحير في الأمر أنه كان يعمل يوم الجمعة الماضي !!! صباح الاثنين ، أعود وأحاول الركض وتجمد فقط. أعلم من عمليات التشغيل السابقة أن الأمر يستغرق حوالي 60 دقيقة للانتهاء ، لكنني انتظرت وقتًا أطول من ذلك ولم يحدث شيء ، إنه معلق فقط ، ولا رسائل خطأ ، ولا شيء ، وجهاز الكمبيوتر الخاص بي يسخن ويمتص الطاقة كما لو لم يكن هناك غدًا. الرمز أدناه. حاولت تغيير n_iter إلى 2 و n_jobs = 1 بعد قراءة بعض التعليقات هنا والتي نجحت. لذلك قد يكون لها علاقة بـ n_jobs = -1. لا يزال ، هذا الرمز يعمل بشكل جيد يوم الجمعة الماضي! انها فقط تكره الاثنين. حجم مجموعة البيانات أقل من 20 ألف مثال بأبعاد <100 ..

from sklearn.metrics import make_scorer
from sklearn.cross_validation import cross_val_score
from sklearn.grid_search import RandomizedSearchCV
import sklearn_crfsuite

crf = sklearn_crfsuite.CRF(
    algorithm='lbfgs', 
    max_iterations=100, 
    all_possible_transitions=True
)
params_space = {
    'c1': scipy.stats.expon(scale=0.5),
    'c2': scipy.stats.expon(scale=0.05),
}

f1_scorer = make_scorer(metrics.flat_f1_score, 
                        average='weighted', labels=labels)
rs = RandomizedSearchCV(crf, params_space, 
                        cv=3, 
                        verbose=1, 
                        n_jobs=-1, 
                        n_iter=50, 
                        scoring=f1_scorer)

rs.fit(X_train, y_train)  # THIS IS WHERE IT FREEZES

ما هو crf؟ فقط للقضاء على الاحتمالية ، هل يمكنك محاولة استخدام
return_train_score = خطأ؟

فمن المحتمل جدا أن هذاKaisJM الصورة المشكلة بسبب قيود معروفة على تسريع مع متعدد المعالجة، يرجى الاطلاع على الأسئلة الشائعة .

كيف قمت بتثبيت scikit-learn؟

أيضًا للرجوع إليها في المستقبل ، هل يمكنك لصق ناتج:

import platform; print(platform.platform())
import sys; print("Python", sys.version)
import numpy; print("NumPy", numpy.__version__)
import scipy; print("SciPy", scipy.__version__)
import sklearn; print("Scikit-Learn", sklearn.__version__)

كان هذا يعمل يوم الجمعة الماضي !! لم أفعل شيئًا منذ ذلك الحين. أعتقد أن scikit Learn جزء من الأناكوندا ، لكنني قمت بالترقية باستخدام pip (تثبيت نقطة - ترقية sklearn) ، ولكن هذا قبل أن أتلقى هذه المشكلة .. قمت بتشغيل الكود جيدًا بعد الترقية إلى 0.19.

هذا هو ناتج المطبوعات أعلاه:

Darwin-15.6.0-x86_64-i386-64bit
('Python', '2.7.12 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:43:17) \n[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)]')
('NumPy', '1.13.1')
('SciPy', '0.19.1')
('Scikit-Learn', '0.19.0')

jnothman : أنا أستخدم RandomizedSearchCV من sklearn.grid_search الذي لا يحتوي على المعلمة return_train_score. أعلم أن sklearn.grid_search مزعج .. سأحاول ذلك من sklearn.model_selection ، لكن شيئًا ما يخبرني أنني سأواجه نفس المشكلة بالضبط). تعليق أصلي محدث بمزيد من المعلومات والرمز.

هل يمكنك ترحيل ناتج conda list | grep numpy . أود أن أعتقد أنه من خلال تحديث scikit-Learn باستخدام pip ، قمت بتحديث numpy باستخدام pip أيضًا ، وحصلت على العجلات المعقدة التي تستخدم Accelerate ولديها القيود المذكورة أعلاه.

كلمة نصيحة صغيرة:

  • انشر مقتطفًا منفردًا بالكامل (لمشكلتك التالية). هذا يعني أنه يمكن لأي شخص نسخها ولصقها في جلسة IPython ومحاولة إعادة إنتاجها بسهولة. سيعطيك هذا أفضل فرصة للحصول على تغذية مرتدة جيدة.
  • إذا كنت تستخدم conda ، فالتزم بـ conda لإدارة الحزم المتوفرة من خلال conda. استخدم النقطة فقط عندما تضطر إلى ذلك.
  • إذا كنت تصر على أنك تريد استخدام pip install --update ، فإنني أوصيك بشدة باستخدام pip install --update --no-deps . خلاف ذلك ، إذا كانت الحزمة تعتمد ، على سبيل المثال على numpy ، ولم يكن لديك أحدث numpy ، فسيتم ترقية numpy بالنقطة ، وهو ما لا تريده.

حسنًا ، راجع للشغل ، تم إهمال sklearn.grid_search ، ربما تريد استخدام sklearn.model_selection في نقطة واحدة ليست بعيدة جدًا على الطريق.

نصيحة جيدة ، شكرا لك. فهل الحل لخفض مستوى numpy؟ ما القيد الذي تشير إليه؟ رابط الأسئلة الشائعة أعلاه؟ لقد قرأته ، لكنني لا أفهم هذه الأشياء (أنا مجرد رجل خاطر :)).

إنتاج conda list | grep numpy

numpy 1.12.0
numpy 1.12.0 py27_0
numpy 1.13.1
numpydoc 0.7.0

Wow three numpy مثبتة لقد رأيت اثنين من قبل ولكن ليس ثلاثة ... على أي حال ، يبدو هذا مؤشراً على المشكلة التي أذكرها ، أي أن لديك نقطة مختلطة وكوندا وهي فكرة سيئة لحزمة معينة.

pip uninstall -y # maybe a few times to make sure you have removed pip installed packages
conda install numpy -f

نأمل بعد ذلك أن تحصل على قطعة واحدة تستخدم MKL.

إذا كنت مكانك ، فسأحقق مجددًا من أنه ليس لديك نفس المشكلة بالنسبة للحزم العلمية الأساسية الأخرى ، مثل scipy ، إلخ ...

السبب الذي جعلني ألجأ إلى pip لبعض الحزم هو أن conda لا تحتوي على بعض الحزم ، وهو أمر محبط للغاية في الواقع لأنني أعلم أن خلط pip مع conda فكرة سيئة. في المرة القادمة التي سيحدث فيها ذلك ، سأستخدم الخيار - no-deps.

شيء واحد كان يجب أن أذكره هو أنني قمت بتثبيت Spyder داخل بيئة python التي كنت أعمل فيها. ومع ذلك ، تمكنت من تشغيل الكود بعد تثبيت Spyder ، في كل من Spyder و Jupyter.

لقد قمت بإلغاء تثبيت Spyder و numpys أعلاه ، وأعدت تثبيت bumpy مع conda (الذي قام بتحديث scikit إلى 0.19) وما زلت أحصل على نفس الخطأ. ربما حدث شيء ما بسبب تثبيت Spyder ، ولكن بعد ذلك لماذا يعمل ليوم واحد ثم يتوقف فجأة ؟؟

حسنًا ، لا شيء يعمل !! هل يجب علي فقط إنشاء بيئة جديدة (باستخدام conda) وإعادة تثبيت كل شيء هناك؟ هل سيحلها ذلك أم يزيدها سوءًا؟

يبدو يستحق المحاولة!

خلق بيئة جديدة وتثبيت كل شيء مع conda ، لا يزال يتجمد إلى أجل غير مسمى. نسخة واحدة فقط من كل حزمة وما إلى ذلك.

n_jobs = 1 تعمل ، لكنها تستغرق وقتًا طويلاً بالطبع (لقد نجحت أيضًا في البيئة السابقة). n_jobs = -1 هو ما يتجمد إلى أجل غير مسمى.

conda list | grep numpy
numpy                     1.13.1           py27hd567e90_2


Darwin-15.6.0-x86_64-i386-64bit
('Python', '2.7.13 |Continuum Analytics, Inc.| (default, Dec 20 2016, 23:05:08) \n[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]')
('NumPy', '1.13.1')
('SciPy', '0.19.1')
('Scikit-Learn', '0.19.0')

ثم لا أعرف. الطريقة الوحيدة التي يمكننا بها التحقيق ، هي نشر مقتطف مستقل تمامًا يمكننا فقط نسخه ولصقه في إصدار IPython ومعرفة ما إذا كان بإمكاننا إعادة إنتاج المشكلة.

سيحاول إنشاء نموذج مبسط يعيد إنتاج المشكلة. أحتاج إلى القيام بذلك لتصحيح الأخطاء بشكل أكثر كفاءة.

قرأت إدخال الأسئلة الشائعة الذي تشير إليه حول "تسريع" .. لا يساعدني كثيرًا. ما أخذته منه هو أن الشوكة () غير متبوعة باستدعاء exec () سيء. لقد قمت ببعض البحث في googling على هذا ولا شيء حتى الآن يلمح إلى حل بديل. هل يمكنك الإشارة إلى مزيد من المعلومات ومزيد من التفاصيل حول ماهية المشكلة؟ شكرا،

جرب هذا المقتطف (مأخوذ من https://github.com/numpy/numpy/issues/4776):

import multiprocessing as mp

import numpy as np


def compute(n):
    print('Enter')
    np.dot(np.eye(n), np.eye(n))
    print('Exit')


print('\nWithout multiprocessing:')
compute(1000)

print('\nWith multiprocessing:')
workers = mp.Pool(1)
results = workers.map(compute, (1000, 1000))
  • إذا تجمد هذا (أي أنه لا ينتهي في غضون ثانية واحدة) ، فهذا يعني أنك تستخدم Accelerate وأن التجميد هو قيد معروف في معالجة Python المتعددة. الحل البديل هو عدم استخدام Accelerate. في OSX ، يمكنك القيام بذلك باستخدام conda الذي يستخدم MKL افتراضيًا. يمكنك أيضًا استخدام OpenBLAS باستخدام conda-forge.
  • إذا لم يتم تجميده ، فأنت لا تستخدم Accelerate ، وسنحتاج إلى مقتطف مستقل للتحقيق.

سيحاول التكاثر بأدنى حد من الكود.

Without multiprocessing:
Enter
Exit

With multiprocessing:
Enter
Exit
Enter
Exit

GaelVaroquaux scikit-learn ليس تطبيقًا ولكنه مكتبة في نظام بيئي غني. إذا فعل الجميع ما نفعله ، فسوف ينهار كل شيء. هذه إشارة واضحة جدًا على أننا بحاجة إلى التغيير. وهناك العديد من البيئات حيث العكس هو الصحيح من هذا التعليق.

لقد استخدمت مثيل ubuntu الظاهري في محرك الحوسبة السحابية من Google (لم تكن وعرة ، حار ، scikit ، إلخ ، هي الأحدث). تم تشغيل الكود بشكل جيد. ثم قمت بتثبيت Gensim. تم تحديث هذا numpy و scipy إلى أحدث الإصدارات وقام بتثبيت بعض الأشياء الأخرى التي يحتاجها (boto و bz2file و smart_open). بعد ذلك يتجمد الرمز. آمل أن يعطي هذا دليلًا مفيدًا حول أسباب هذا التجميد.

بعد تثبيت Gensim
تم تحديث numpy (1.10.4) إلى numpy (1.13.3)
تم تحديث scipy (0.16.1) إلى scipy (0.19.1)

مزيد من المعلومات:
أثناء إجراء بعض الأبحاث ، وجدت أن libblas و liblapack و liblapack_atlas كانت مفقودة من my / usr / lib / ، كما أنني لم أر الدليل / usr / lib / atlas-base /. لا أعرف ما إذا كانوا هناك وقاموا بإزالة تثبيت gensim نظرًا لأنه تم تحديث numpy وما إلى ذلك ، ولكن هذا على الأرجح لأن الكود يعمل قبل تثبيت gensim. لقد قمت بتثبيتها باستخدام sudo apt-get --yes install libatlas-base-dev و "_update-options_" وفقًا لإرشادات تثبيت scikit المتقدمة ، لكنها لم تساعد ، لا يزال الكود يتجمد مع n_jobs = -1.

أعتقد أن المشكلة هي أن numpy يستخدم OpenBlas. سيتم تحويله إلى نظام أطلس ونرى ما سيحدث.

>>> import numpy as np
>>> np.__config__.show()
lapack_opt_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
blas_opt_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
openblas_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
openblas_lapack_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
blas_mkl_info:
  NOT AVAILABLE

لا تزال نفس المشكلة. ما يلي يعمل بشكل جيد ، إلا إذا قمت بإدخال n_jobs = -1.

from sklearn.metrics import fbeta_score

def f2_score(y_true, y_pred):
    y_true, y_pred, = np.array(y_true), np.array(y_pred)
    return fbeta_score(y_true, y_pred, beta=2, average='binary')

clf_rf = RandomForestClassifier()
grid_search = GridSearchCV(clf_rf, param_grid=param_grid, scoring=make_scorer(f2_score), cv=5)
grid_search.fit(X_train, y_train)  

paulaceccon هل يتم

من الصعب بعض الشيء متابعة ما فعلتهKaisJM. من وجهة نظر المشرف ، ما نحتاجه هو مقتطف بيثون مستقل تمامًا لمعرفة ما إذا كان بإمكاننا التكاثر. إذا استطعنا التكاثر ، عندها فقط يمكننا التحقيق ومحاولة فهم ما يحدث. إذا حدث ذلك فقط عند تثبيت gensim وتمكنت من إعادة إنتاج هذا السلوك باستمرار ، فسنحتاج إلى إرشادات كاملة حول كيفية إنشاء بيئة Python التي بها مشكلة مقابل بيئة Python التي لا توجد بها المشكلة.

هذا يتطلب قدرًا كبيرًا من الوقت والجهد ، وأنا أتفق تمامًا ، ولكن بدون ذلك ، أخشى أنه لا يوجد الكثير يمكننا القيام به للتحقيق في المشكلة التي تواجهها.

وفقًا لتعليمات التثبيت المتقدمة

KaisJM بالمناسبة ، هذه الصفحة قديمة ، نظرًا لأن العجلات متوفرة حاليًا على Linux وتحتوي على OpenBLAS الخاص بها. إذا قمت بتثبيت برنامج scikit-learn مع بيب سوف تستخدم OpenBLAS.

@ lesteve هل تقول أن Openblas لا يتسبب في تجميد بعد الآن؟

نشر @ lesteve paula مقتطفًا به نفس المشكلة أيضًا. أستطيع أن أرى أنه ليس رمزًا كاملاً ، لكنني آمل أن يقدم بعض الأدلة. يمكنني أن أجعل المقتطف هنا "مكتملاً" وأنشره لك. ومع ذلك ، من الواضح أن صفحة التعليمات "القديمة" - كما تسميها - قد لا تكون قديمة. الاحتمال الأكبر هو أن OpenBLAS تسبب الرسوم التي يتحدثون عنها في تلك الصفحة.

هذه التعليمات عفا عليها الزمن صدقوني. إذا قرأت بالتفصيل ، فستجد أنه "ولكن يمكنك تجميد قائمة الوظائف / المعالجة المتعددة قبل إصدار OpenBLAS 0.2.8-4". لقد تحققت من عجلة فارغة حديثة وتحتوي على OpenBLAS 0.2.8.18. التجميد الذي يشيرون إليه هو التجميد الموجود في https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -334155175 ، والذي لا يبدو أنك تمتلكه.

أستطيع أن أرى أنه ليس رمزًا كاملاً ، لكنني آمل أن يقدم بعض الأدلة

لا حقا لا. لدينا تقارير عن المستخدمين يبدو أنها تشير إلى أن التجميد لا يزال ممكنًا ، ولم ننجح في إعادة إنتاج AFAIK. يبدو أن هذا يشير إلى أن هذه المشكلة تحدث في مجموعة محددة جدًا من العوامل. ما لم يقضي شخص يعاني من المشكلة بعض الوقت ويكتشف كيفية التكاثر بطريقة مسيطر عليها وننجح في التكاثر ، فلا توجد طريقة يمكننا فعل أي شيء حيال ذلك.

يمكنني أن أجعل المقتطف هنا "مكتملاً" وأنشره لك

هذا سيكون رائع. سيكون ذلك رائعًا إذا تمكنت من التحقق مما إذا كان مثل هذا المقتطف لا يزال يتسبب في التجميد في بيئة conda منفصلة (أو virtualenv اعتمادًا على ما تستخدمه).

@ lestevepaulaceccon : أخذت كود مقتطفات Paula وقمت بعمل مقتطف شفرة كامل قابل للتشغيل. ما عليك سوى لصقها في خلية Jupyter وتشغيلها. باولا: لم أستطع تجميد هذا المقتطف. لاحظ أن n_jobs = -1 وتعمل بشكل جيد. سيكون رائعًا إذا كان بإمكانك إلقاء نظرة ونشر نسخة منه تتجمد. لاحظ أنه يمكنك التبديل بين وحدة grid_search ووحدة model_selection ، وكلاهما يعمل بشكل جيد بالنسبة لي.

import platform; print(platform.platform())
import sys; print("Python", sys.version)
import numpy as np; print("NumPy", np.__version__)
import scipy; print("SciPy", scipy.__version__)
import sklearn; print("Scikit-Learn", sklearn.__version__)

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification

import scipy.stats
from sklearn.metrics import make_scorer
from sklearn.grid_search import RandomizedSearchCV
#from sklearn.model_selection import RandomizedSearchCV
#from sklearn.model_selection import GridSearchCV
from sklearn.metrics import fbeta_score

X, y = make_classification(n_samples=1000, n_features=4,
                           n_informative=2, n_redundant=0,
                           random_state=0, shuffle=False)

clf_rf = RandomForestClassifier(max_depth=2, random_state=0)

def f2_score(y_true, y_pred):
    y_true, y_pred, = np.array(y_true), np.array(y_pred)
    return fbeta_score(y_true, y_pred, beta=2, average='binary')

param_grid = {'max_depth':[2, 3, 4], 'random_state':[0, 3, 7, 17]}

grid_search = RandomizedSearchCV(clf_rf, param_grid, n_jobs=-1, scoring=make_scorer(f2_score), cv=5)

grid_search.fit(X, y)

KaisJM أعتقد أنه من المفيد أكثر إذا بدأت من نص التجميد الخاص بك

@ lesteve متفق عليه. لقد أنشأت بيئة python2 جديدة مثل تلك التي كنت أستخدمها قبل تثبيت Gensim. تم تشغيل الكود بشكل جيد ، لا يوجد تجميد مع n_jobs = -1. علاوة على ذلك ، يستخدم Numpy OpenBLAS ولديه نفس التكوين مثل البيئة التي تعرض التجميد (المكان الذي تم تثبيت Gensim فيه). لذلك يبدو أن openblas ليس سبب هذا التجميد.

bumpy.__config__.show()
lapack_opt_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
blas_opt_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
openblas_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
openblas_lapack_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
blas_mkl_info:
  NOT AVAILABLE

KaisJM أقوم بتشغيل نفس المقتطف هنا (windows) ويتجمد.

from sklearn.datasets import make_classification
X, y = make_classification()

from sklearn.ensemble import RandomForestClassifier
clf_rf_params = {
    'n_estimators': [400, 600, 800],
    'min_samples_leaf' : [5, 10, 15],
    'min_samples_split' : [10, 15, 20],
    'criterion': ['gini', 'entropy'],
    'class_weight': [{0: 0.51891309,  1: 13.71835531}]
}

import numpy as np
def ginic(actual, pred):
    actual = np.asarray(actual) # In case, someone passes Series or list
    n = len(actual)
    a_s = actual[np.argsort(pred)]
    a_c = a_s.cumsum()
    giniSum = a_c.sum() / a_s.sum() - (n + 1) / 2.0
    return giniSum / n

def gini_normalizedc(a, p):
    if p.ndim == 2:  # Required for sklearn wrapper
        p = p[:,1]   # If proba array contains proba for both 0 and 1 classes, just pick class 1
    return ginic(a, p) / ginic(a, a)

from sklearn import metrics
gini_sklearn = metrics.make_scorer(gini_normalizedc, True, True)

from sklearn.model_selection import GridSearchCV

clf_rf = RandomForestClassifier()
grid = GridSearchCV(clf_rf, clf_rf_params, scoring=gini_sklearn, cv=3, verbose=1, n_jobs=-1)
grid.fit(X, y)

print (grid.best_params_)

أعلم أنه أمر محرج ولكنه لم يتجمد عند الجري بمقياس مخصص.

لدي مشكلة مماثلة. لقد قمت بتشغيل نفس الكود وأردت ببساطة تحديث النموذج ببيانات الشهر الجديد وتوقف عن العمل. أعتقد أنه تم تحديث sklearn في هذه الأثناء إلى 0.19

تشغيل GridSearchCV أو RandomizedSearchCV في حلقة و n_jobs> 1 سيتعطل بصمت في Jupiter & IntelliJ:

for trial in tqdm(range(NUM_TRIALS)):
    ...
    gscv = GridSearchCV(estimator=estimator, param_grid=param_grid,
                          scoring=scoring, cv=cv, verbose=1, n_jobs=-1)
    gscv.fit(X_data, y_data)

    ...

تم اتباع توصية

داروين -16.6.0-x86_64-i386-64 بت
Python 3.6.1 | Anaconda Custom (x86_64) | (افتراضي ، 11 مايو 2017 ، 13:04:09)
[GCC 4.2.1 متوافق Apple LLVM 6.0 (clang-600.0.57)]
NumPy 1.13.1
SciPy 0.19.1.0 تحديث
Scikit-Learn 0.19.0.0 تحديث

قائمة كوندا $ | grep numpy
gnumpy 0.2 نقطة
numpy 1.13.1 py36_0
رقم 1.13.3 نقطة
numpydoc 0.6.0 py36_0

إلغاء تثبيت $ pip numpy

قائمة كوندا $ | grep numpy
gnumpy 0.2 نقطة
numpy 1.13.1 py36_0
numpydoc 0.6.0 py36_0

$ conda install numpy -f // غير ضروري على الأرجح

قائمة كوندا $ | grep numpy
gnumpy 0.2 نقطة
numpy 1.13.1 py36_0
numpydoc 0.6.0 py36_0

أصلحت مشكلتي.

paulaceccon تتعلق مشكلتك بـ

https://stackoverflow.com/questions/36533134/cant-get-attribute-abc-on-module-main-from-abc-h-py
إذا قمت بتعريف التجمع قبل التصريح عن الوظيفة التي تحاول استخدامها بالتوازي ، فسيؤدي ذلك إلى ظهور هذا الخطأ. قم بعكس الترتيب ولن يؤدي إلى ظهور هذا الخطأ بعد الآن.

سيقوم ما يلي بتشغيل التعليمات البرمجية الخاصة بك:

import multiprocessing

if __name__ == '__main__':
    multiprocessing.set_start_method('spawn')

    from external import *

    from sklearn.datasets import make_classification
    X, y = make_classification()

    from sklearn.ensemble import RandomForestClassifier
    clf_rf_params = {
        'n_estimators': [400, 600, 800],
        'min_samples_leaf' : [5, 10, 15],
        'min_samples_split' : [10, 15, 20],
        'criterion': ['gini', 'entropy'],
        'class_weight': [{0: 0.51891309,  1: 13.71835531}]
    }

    from sklearn.model_selection import GridSearchCV

    clf_rf = RandomForestClassifier()
    grid = GridSearchCV(clf_rf, clf_rf_params, scoring=gini_sklearn, cv=3, verbose=1, n_jobs=-1)
    grid.fit(X, y)

    print (grid.best_params_)

مع External.py

import numpy as np
def ginic(actual, pred):
    actual = np.asarray(actual) # In case, someone passes Series or list
    n = len(actual)
    a_s = actual[np.argsort(pred)]
    a_c = a_s.cumsum()
    giniSum = a_c.sum() / a_s.sum() - (n + 1) / 2.0
    return giniSum / n

def gini_normalizedc(a, p):
    if p.ndim == 2:  # Required for sklearn wrapper
        p = p[:,1]   # If proba array contains proba for both 0 and 1 classes, just pick class 1
    return ginic(a, p) / ginic(a, a)

from sklearn import metrics
gini_sklearn = metrics.make_scorer(gini_normalizedc, True, True)

النتائج تعمل على 8 نوى

تركيب 3 طيات لكل من 54 مرشحًا ، بإجمالي 162 تناسبًا
{'class_weight': {0: 0.51891309، 1: 13.71835531}، 'المعيار': 'gini'، 'min_samples_leaf': 10، 'min_samples_split': 20، 'n_estimators': 400}

القضية لا تزال هناك يا شباب. أنا أستخدم أداة تسجيل مخصصة وتستمر إلى الأبد عندما أقوم بتعيين n_jobs على أي شيء. عندما لا أحدد n_jobs على الإطلاق ، فإنها تعمل بشكل جيد ولكنها تتجمد بخلاف ذلك.

هل يمكنك توفير مقتطف مستقل لإعادة إظهار المشكلة؟ يرجى قراءة https://stackoverflow.com/help/mcve لمزيد من التفاصيل.

لا تزال تواجه هذه المشكلة بنفس رمز العينة.

نظام التشغيل Windows-10-10.0.15063-SP0
Python 3.6.4 | أناكوندا مخصص (64 بت) | (افتراضي ، 16 يناير 2018 ، 10:22:32) [MSC v.1900 64 بت (AMD64)]
NumPy 1.14.1
SciPy 1.0.0.0 تحديث
Scikit-Learn 0.19.1.1 تحديث

هل يمكنك توفير مقتطف مستقل لإعادة إظهار المشكلة؟ يرجى قراءة https://stackoverflow.com/help/mcve لمزيد من التفاصيل.

أظن أن هذا هو نفس المعالجة المتعددة القديمة في مشكلة windows. انظر الأسئلة الشائعة

لقد اختبرت الكود في https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -337985212 الخاص بـ thomberg1.

نظام التشغيل: Windows 10 x64 10.0.16299.309
حزمة Python: WinPython-64bit-3.6.1
numpy (1.14.2)
scikit-Learn (0.19.1)
scipy (1.0.0)

عملت بشكل جيد في Jupyter Notebook وسطر الأوامر.

مرحبًا ، لدي نفس المشكلة ، لذلك لم أرغب في فتح واحدة جديدة يمكن أن تؤدي إلى موضوع متطابق تقريبًا.

-ماكوس
أناكوندا
-scikit-Learn 0.19.1.0 تحديث
-Scipy 1.0.1
-Numpy 1.14.2

# MLP for Pima Indians Dataset with grid search via sklearn
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import GridSearchCV
import numpy

# Function to create model, required for KerasClassifier
def create_model(optimizer='rmsprop', init='glorot_uniform'):
  # create model
  model = Sequential()
  model.add(Dense(12, input_dim=8, kernel_initializer=init, activation='relu'))
  model.add(Dense(8, kernel_initializer=init, activation='relu'))
  model.add(Dense(1, kernel_initializer=init, activation='sigmoid'))
  # Compile model
  model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
  return model

# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]


# create model
model = KerasClassifier(build_fn=create_model, verbose=0)
# grid search epochs, batch size and optimizer
optimizers = ['rmsprop', 'adam']
init = ['glorot_uniform', 'normal', 'uniform']
epochs = [50, 100, 150]
batches = [5, 10, 20]
param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init)
grid = GridSearchCV(estimator=model, param_grid=param_grid)
grid_result = grid.fit(X, Y)
# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
  print("%f (%f) with: %r" % (mean, stdev, param))

الكود من برنامج تعليمي: https://machinelearningmastery.com/use-keras-deep-learning-models-scikit-learn-python/
حاولت تغيير المعلمة n_jobs إلى 1 ، -1 ، لكن لم ينجح أي منهما. أي تلميح؟

يتم تشغيله إذا أضفت استيراد المعالجات المتعددة وعبارة if كما هو موضح أدناه - لا أعمل مع keras لذلك ليس لدي المزيد من البصيرة

import multiprocessing

if __name__ == '__main__':

    # MLP for Pima Indians Dataset with grid search via sklearn
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.wrappers.scikit_learn import KerasClassifier
    from sklearn.model_selection import GridSearchCV
    import numpy

    # Function to create model, required for KerasClassifier
    def create_model(optimizer='rmsprop', init='glorot_uniform'):
      # create model
      model = Sequential()
      model.add(Dense(12, input_dim=8, kernel_initializer=init, activation='relu'))
      model.add(Dense(8, kernel_initializer=init, activation='relu'))
      model.add(Dense(1, kernel_initializer=init, activation='sigmoid'))
      # Compile model
      model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
      return model

    # fix random seed for reproducibility
    seed = 7
    numpy.random.seed(seed)
    # load pima indians dataset
    dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
    # split into input (X) and output (Y) variables
    X = dataset[:,0:8]
    Y = dataset[:,8]


    # create model
    model = KerasClassifier(build_fn=create_model, verbose=0)
    # grid search epochs, batch size and optimizer
    optimizers = ['rmsprop', 'adam']
    init = ['glorot_uniform', 'normal', 'uniform']
    epochs = [5]
    batches = [5, 10, 20]
    param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init)
    grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=12, verbose=1)
    grid_result = grid.fit(X, Y)
    # summarize results
    print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
    means = grid_result.cv_results_['mean_test_score']
    stds = grid_result.cv_results_['std_test_score']
    params = grid_result.cv_results_['params']
    for mean, stdev, param in zip(means, stds, params):
      print("%f (%f) with: %r" % (mean, stdev, param))

تركيب 3 طيات لكل من 18 مرشحًا ، بإجمالي 54 نوبة

الأفضل: 0.675781 باستخدام {'batch_size': 5، 'epochs': 5، 'init': 'glorot_uniform'، 'optimizer': 'adam'}
0.621094 (0.036225) مع: {'batch_size': 5، 'epochs': 5، 'init': 'glorot_uniform'، 'optimizer': 'rmsprop'}
0.675781 (0.006379) مع: {'batch_size': 5، 'epochs': 5، 'init': 'glorot_uniform'، 'optimizer': 'adam'}
...
0.651042 (0.025780) مع: {'batch_size': 20، 'epochs': 5، 'init': 'uniform'، 'optimizer': 'adam'}


معلومات الإصدار إذا لزم الأمر
sys 3.6.4 | أناكوندا مخصص (64 بت) | (افتراضي ، 16 كانون الثاني (يناير) 2018 ، 12:04:33)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags / RELEASE_401 / final)]
numpy 1.14.2
الباندا 0.22.0
sklearn 0.19.1.0 تحديث
الشعلة 0.4.0a0 + 9692519
IPython 6.2.1
كيراس 2.1.5

المترجم: GCC 4.2.1 Compatible Clang 4.0.1 (tags / RELEASE_401 / final)
النظام: داروين
الإصدار: 17.5.0
الجهاز: x86_64
المعالج: i386
أنوية وحدة المعالجة المركزية: 24
مترجم: 64 بت

شكرا لك @ thomberg1 ، ولكن الإضافة

import multiprocessing
if __name__ == '__main__':

لم يساعد. المشكلة لا تزال هي نفسها

نفس المشكلة على جهازي عند استخدام وظيفة التسجيل المخصصة في GridsearchCV .
بيثون 3.6.4 ،
scikit-Learn 0.19.1 ،
نوافذ 10. ،
أنوية وحدة المعالجة المركزية: 24

byrony هل يمكنك توفير رمز لإعادة إنتاجه؟ هل استخدمت if __name__ == "__main__" ؟

لقد واجهت مشكلة مماثلة عدة مرات على جهازي عند استخدام n_jobs=-1 أو n_jobs=8 كوسيطة لـ GridsearchCV لكن باستخدام وسيطة المسجل الافتراضية.

  • Python 3.6.5 ،
  • scikit-Learn 0.19.1 ،
  • قوس لينكس ،
  • أنوية وحدة المعالجة المركزية: 8.

هذا هو الكود الذي استخدمته:

from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import MinMaxScaler
from sklearn.decomposition import PCA
from sklearn.utils import shuffle
from sklearn.neural_network import MLPClassifier
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np


def main():

    df = pd.read_csv('../csvs/my_data.csv', nrows=4000000)    

    X = np.array(list(map(lambda a: np.fromstring(a[1:-1] , sep=','), df['X'])))
    y = np.array(list(map(lambda a: np.fromstring(a[1:-1] , sep=','), df['y'])))

    scalerX = MinMaxScaler()
    scalerY = MinMaxScaler()
    X = scalerX.fit_transform(X)
    y = scalerY.fit_transform(y)

    grid_params = {
        'beta_1': [ .1, .2, .3, .4, .5, .6, .7, .8, .9 ],
        'activation': ['identity', 'logistic', 'tanh', 'relu'],
        'learning_rate_init': [0.01, 0.001, 0.0001]
    }

    estimator = MLPClassifier(random_state=1, 
                              max_iter=1000, 
                              verbose=10,
                              early_stopping=True)

    gs = GridSearchCV(estimator, 
                      grid_params, 
                      cv=5,
                      verbose=10, 
                      return_train_score=True,
                      n_jobs=8)

    X, y = shuffle(X, y, random_state=0)

    y = y.astype(np.int16)    

    gs.fit(X, y.ravel())

    print("GridSearchCV Report \n\n")
    print("best_estimator_ {}".format(gs.best_estimator_))
    print("best_score_ {}".format(gs.best_score_))
    print("best_params_ {}".format(gs.best_params_))
    print("best_index_ {}".format(gs.best_index_))
    print("scorer_ {}".format(gs.scorer_))
    print("n_splits_ {}".format(gs.n_splits_))

    print("Exporting")
    results = pd.DataFrame(data=gs.cv_results_)
    results.to_csv('../csvs/gs_results.csv')


if __name__ == '__main__':
    main()

أعلم أن مجموعة البيانات كبيرة ، لذا توقعت أن الأمر سيستغرق بعض الوقت للحصول على النتائج ، ولكن بعد يومين من التشغيل ، توقف البرنامج عن العمل (يستمر البرنامج النصي في التنفيذ ولكنه لا يستخدم أي مورد بخلاف ذاكرة الوصول العشوائي والمبادلة).

captura de pantalla de 2018-05-25 17-53-11

captura de pantalla de 2018-05-25 17-54-59

شكرا لك مقدما!

amueller لم أستخدم if __name__ == "__main__" . يوجد أدناه الكود الخاص بي ، فهو يعمل فقط عند n_jobs=1

def neg_mape(true, pred):
    true, pred = np.array(true)+0.01, np.array(pred)
    return -1*np.mean(np.absolute((true - pred)/true))

xgb_test1 = XGBRegressor(
    #learning_rate =0.1,
    n_estimators=150,
    max_depth=3,
    min_child_weight=1,
    gamma=0,
    subsample=0.8,
    colsample_bytree=0.8,
    objective= 'reg:linear',
    nthread=4,
    scale_pos_weight=1,
    seed=123,
)

param_test1 = {
    'learning_rate':[0.01, 0.05, 0.1, 0.2, 0.3],
}

gsearch1 = GridSearchCV(estimator = xgb_test1, param_grid = param_test1, scoring=neg_mape, n_jobs=4, cv = 5)

أنت تستخدم XGBoost. لا أعرف ماذا يفعلون داخليًا ، فمن المحتمل جدًا أن تكون هذه هي المشكلة. هل يمكنك محاولة معرفة ما إذا كانت إضافة if __name__ تساعد؟
وإلا لا أعتقد أن هناك حلًا لذلك حتى الآن.

@ Pazitos10 هل يمكنك إعادة الإنتاج باستخدام بيانات تركيبية و / أو بيانات أصغر؟ لا يمكنني التكاثر بدون بياناتك وسيكون من الجيد التكاثر في وقت أقصر.

amueller حسنًا ، سأقوم بتشغيله مرة أخرى بـ 500 ألف صف

amueller ، يعمل تشغيل البرنامج النصي الذي يحتوي على 50 ألف صف كما هو متوقع. ينتهي النص بشكل صحيح ، ويظهر النتائج على النحو التالي (معذرة ، قصدت 50 كيلو وليس 500 كيلو):

captura de pantalla de 2018-05-26 13-09-00

captura de pantalla de 2018-05-26 13-09-51

المشكلة هي أنني لا أعرف ما إذا كانت هذه النتائج ستكون الأفضل لمجموعة البيانات بأكملها. اي نصيحه؟

يبدو أنك نفذت ذاكرة الوصول العشوائي. ربما حاول استخدام Keras بدلاً من ذلك ، فمن المحتمل أن يكون حلاً أفضل للشبكات العصبية واسعة النطاق.

amueller أوه ، حسنًا. سأحاول استخدام Keras بدلاً من ذلك. شكرا مرة اخرى!

هذا ليس له علاقة مع المصححين المخصصين. هذه ميزة معروفة لمعالجات Python المتعددة على Windows: عليك تشغيل كل شيء يستخدم n_jobs=-1 في كتلة if __name__ == '__main__' أو ستصاب بالتجمد / الأعطال. ربما ينبغي علينا توثيق هذا في مكان ما بشكل بارز ، على سبيل المثال في README؟

هل ربما تكون فكرة scikit أنه في حالة Windows لتغيير الوظيفة
واستخدم قوائم الانتظار لتغذية المهام لمجموعة من العمليات العاملة وجمع النتائج
كما هو موضح هنا: https://docs.python.org/2/library/multiprocessing.html#windows
وللحصول على 3.6 هنا: https://docs.python.org/3.6/library/multiprocessing.html#windows

PGTBoos هذا ثابت في scikit-Learn 0.20.0

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات