Scikit-learn: Eksekusi paralel GridSearchCV dengan pencetak gol sendiri membeku

Dibuat pada 24 Feb 2014  ·  99Komentar  ·  Sumber: scikit-learn/scikit-learn

Saya telah mencari berjam-jam untuk masalah ini dan dapat secara konsisten menirunya:

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

Cuplikan ini mogok karena scoring=metrics.make_scorer(metrics.scorer.f1_score, average="macro") dengan metrik mengacu pada modul sklearn.metrics. Jika saya membatalkan garis scoring=..., eksekusi paralel bekerja. Jika saya ingin menggunakan skor f1 sebagai metode evaluasi, saya harus membatalkan eksekusi paralel dengan mengatur n_jobs = 1.

Apakah ada cara saya dapat menentukan metode skor lain tanpa kehilangan kemungkinan eksekusi paralel?

Terima kasih

Komentar yang paling membantu

Hum, itu kemungkinan terkait dengan masalah multiprosesor di windows. Mungkin @GaelVaroquaux atau @ogrisel bisa membantu.
Saya tidak tahu apa yang dibuat notebook dari __name__ == "__main__" .
Cobalah untuk tidak menentukan metrik di buku catatan, tetapi dalam file terpisah dan impor. Saya pikir itu akan memperbaikinya.
Ini tidak benar-benar terkait dengan GridSearchCV, tetapi beberapa interaksi menarik antara windows multiprocessing, notebook IPython, dan joblib.

Semua 99 komentar

Ini mengejutkan, jadi kita harus mencari tahu apa masalahnya dan memastikan itu berhasil!

Bisakah Anda memberikan sedikit lebih detail:

  • Apa yang Anda maksud dengan "crash"?
  • Ini scikit-learn versi berapa? Jika 0,14, apakah masih terjadi di versi pengembangan saat ini?
  • Multiprocessing memiliki masalah khusus platform. Anda berada di platform apa? (misalnya import platform; platform.platform() )
  • Sudahkah Anda mencobanya pada kumpulan data yang berbeda?

FWIW, mesin saya tidak memiliki masalah saat memasang iris dengan cuplikan ini pada versi pengembangan sklearn.

Terima kasih atas balasan cepat Anda.

Dengan menabrak, maksud saya sebenarnya membeku. Itu tidak berlanjut lagi dan juga tidak ada lagi aktivitas yang harus dipantau dalam proses python task manager windows. Proses masih ada dan mengkonsumsi jumlah RAM yang konstan tetapi tidak memerlukan waktu pemrosesan.

Ini adalah scikit-learn versi 0.14, terakhir diperbarui dan dijalankan menggunakan Enthought Canopy.

Saya menggunakan platform "Windows-7-6.1.7601-SP1".

Saya akan membahas lebih mendalam dengan memberikan contoh umum masalah. Saya pikir itu ada hubungannya dengan GridSearchCV yang ditempatkan di for loop. (Agar tidak membuang terlalu banyak waktu Anda, Anda mungkin harus memulai metode run_tune_process() yang dipanggil di bagian bawah kode dan memanggil metode yang berisi GridSearchCV() dalam for loop)

Kode:

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)

Sekali lagi, kode ini hanya berfungsi di komputer saya ketika saya mengubah n_jobs menjadi 1 atau ketika saya tidak mendefinisikan argumen scoring=.

Umumnya multiprocessing di Windows menemui banyak masalah. Tetapi saya
tidak tahu mengapa ini harus dikorelasikan dengan metrik khusus. ada
tidak ada apa pun tentang opsi rata-rata=makro di 0,14 yang menunjukkan itu seharusnya
lebih cenderung hang daripada rata-rata default (tertimbang). Pada perkembangannya
kepala, ini selesai dalam 11 detik di macbook saya, dan dalam 7 detik di versi 0.14
(itu sesuatu yang harus diperhatikan!)

Apakah Anda dapat mencoba ini dalam versi pengembangan saat ini, untuk melihat apakah
itu masih menjadi masalah?

Pada 25 Februari 2014 20:40, adverley [email protected] menulis:

Terima kasih atas balasan cepat Anda.

Dengan menabrak, maksud saya sebenarnya membeku. Itu tidak berlanjut lagi dan
juga tidak ada lagi aktivitas yang harus dipantau dalam proses python
pengelola tugas windows. Prosesnya masih ada dan mengkonsumsi
jumlah RAM yang konstan tetapi tidak memerlukan waktu pemrosesan.

Ini adalah scikit-learn versi 0.14, terakhir diperbarui dan dijalankan menggunakan Enthought
Kanopi.

Saya menggunakan platform "Windows-7-6.1.7601-SP1".

Saya akan membahas lebih mendalam dengan memberikan contoh umum masalah. Saya
pikir itu ada hubungannya dengan GridSearchCV yang ditempatkan di for loop. (Ke
tidak membuang terlalu banyak waktu Anda, Anda mungkin harus mulai dari
run_tune_process() metode yang dipanggil di bagian bawah kode
dan memanggil metode yang berisi GridSearchCV() dalam for loop)
Kode:

impor sklearn.metrics sebagai metrik
dari sklearn.grid_search impor GridSearchCV
impor numpy sebagai np
impor os
dari set data impor sklearn
dari sklearn impor svm sebagai sk

def tune_hyperparameters(Data pelatihan, titik):
allDataTrain = data pelatihan

# 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):
untuk periode di np.arange(0,100,10):
clf = hyperparam_tuning_method(Data pelatihan,titik)

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

impor beberapa data untuk dimainkan

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)

Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -35990430
.

(Sebagai tambahan, @ogrisel , saya perhatikan sepertinya ada lebih banyak joblib
overhead paralelisasi di master -- setidaknya di OS X -- itu tidak ada
di 0.14...)

Pada tanggal 25 Februari 2014 21:52, Joel Nothman [email protected] menulis :

Umumnya multiprocessing di Windows menemui banyak masalah. Tetapi saya
tidak tahu mengapa ini harus dikorelasikan dengan metrik khusus. ada
tidak ada apa pun tentang opsi rata-rata=makro di 0,14 yang menunjukkan itu seharusnya
lebih cenderung hang daripada rata-rata default (tertimbang). Pada perkembangannya
kepala, ini selesai dalam 11 detik di macbook saya, dan dalam 7 detik di versi 0.14
(itu sesuatu yang harus diperhatikan!)

Apakah Anda dapat mencoba ini dalam versi pengembangan saat ini, untuk melihat apakah
itu masih menjadi masalah?

Pada 25 Februari 2014 20:40, adverley [email protected] menulis:

Terima kasih atas balasan cepat Anda.

Dengan menabrak, maksud saya sebenarnya membeku. Itu tidak berlanjut lagi dan
juga tidak ada lagi aktivitas yang harus dipantau dalam proses python
pengelola tugas windows. Prosesnya masih ada dan mengkonsumsi
jumlah RAM yang konstan tetapi tidak memerlukan waktu pemrosesan.

Ini adalah scikit-learn versi 0.14, terakhir diperbarui dan dijalankan menggunakan Enthought
Kanopi.

Saya menggunakan platform "Windows-7-6.1.7601-SP1".

Saya akan membahas lebih mendalam dengan memberikan contoh umum masalah.
Saya pikir itu ada hubungannya dengan GridSearchCV yang ditempatkan di for loop. (Ke
tidak membuang terlalu banyak waktu Anda, Anda mungkin harus mulai dari
run_tune_process() metode yang dipanggil di bagian bawah kode
dan memanggil metode yang berisi GridSearchCV() dalam for loop)
Kode:

impor sklearn.metrics sebagai metrik
dari sklearn.grid_search impor GridSearchCV
impor numpy sebagai np
impor os
dari set data impor sklearn
dari sklearn impor svm sebagai sk

def tune_hyperparameters(Data pelatihan, titik):
allDataTrain = data pelatihan

# 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):
untuk periode di np.arange(0,100,10):
clf = hyperparam_tuning_method(Data pelatihan,titik)

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

impor beberapa data untuk dimainkan

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)

Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -35990430
.

Ini tidak ada hubungannya dengan pencetak gol khusus. Ini adalah fitur yang terkenal dari multiprocessing Python di Windows: Anda harus menjalankan semua yang menggunakan n_jobs=-1 dalam blok if __name__ == '__main__' atau Anda akan mendapatkan freeze/crash. Mungkin kita harus mendokumentasikan ini di suatu tempat dengan jelas, misalnya di README?

anda harus menjalankan semua yang menggunakan n_jobs= -1 dalam nama if ==
' main ' blok atau Anda akan mendapatkan macet / mogok.

Nah, kabar baiknya adalah bahwa saat ini joblib memberikan kesalahan yang berarti
pesan pada kecelakaan seperti itu, bukan bom garpu.

@GaelVaroquaux apakah scikit-learn saat ini memberikan pesan kesalahan itu? Jika demikian, masalah ini dapat dianggap telah diperbaiki, IMHO.

@GaelVaroquaux apakah scikit-learn saat ini memberikan pesan kesalahan itu? Jika demikian,
masalah dapat dianggap diperbaiki, IMHO.

Ini harus dilakukan. Satu-satunya cara untuk memastikannya adalah dengan memeriksa. Saya sedang bergerak ke kanan
sekarang, dan saya tidak dapat mem-boot VM Windows untuk melakukan itu.

Saya tidak akan menginstal kompiler C di Windows hanya untuk ini. Maaf, tapi saya benar-benar tidak menggunakan Windows :)

Saya tidak akan menginstal kompiler C di Windows hanya untuk ini. Maaf, tapi aku
benar-benar tidak melakukan Windows :)

Saya memiliki VM Windows. saya bisa memeriksa. Ini hanya pertanyaan untuk menemukan
sedikit waktu untuk melakukannya.

@larsmans , Anda sepenuhnya benar. Objek pencetak gol kustom adalah kesalahan saya, masalahnya memang terletak pada multiprosesor di windows. Saya mencoba kode yang sama di Linux dan itu berjalan dengan baik.

Saya tidak mendapatkan pesan kesalahan apa pun karena tidak macet, hanya berhenti melakukan sesuatu yang berarti.

@adverley Bisakah Anda mencoba versi terbaru dari GitHub di kotak Windows Anda?

Menutup karena kurangnya feeback dan itu mungkin masalah umum yang diperbaiki di joblib yang lebih baru.

Tidak yakin apakah terkait, sepertinya.

Di windows, pencetak gol kustom masih membeku. Saya menemukan utas ini di google - menghapus pencetak gol, dan pencarian kisi berfungsi.

Ketika membeku, itu tidak menunjukkan pesan kesalahan. Ada 3 proses python yang muncul juga (karena saya mengatur n_jobs=3). Namun, pemanfaatan CPU tetap 0 untuk semua proses python. Saya menggunakan Notebook IPython.

Bisakah Anda membagikan kode pencetak gol? Tampaknya agak tidak mungkin.

Apakah pencetak gol Anda menggunakan joblib / n_jobs di mana saja? Seharusnya tidak, dan itu mungkin dapat menyebabkan masalah (meskipun saya pikir joblib harus mendeteksi itu).

Tentu - ini kode lengkapnya - http://Pastebin.com/yUE26SNs

Fungsi pencetak gol adalah "score_model", tidak menggunakan joblib.

Ini berjalan dari command prompt, tetapi tidak dari Notebook IPython. Pesan kesalahannya adalah -
AttributeError: Can't get attribute 'score_model' on <module '__main__' (built-in)>;

Kemudian IPython dan semua instance python yang muncul menjadi idle - diam-diam - dan tidak menanggapi kode python lagi sampai saya memulai ulang.

Perbaiki kesalahan atribut, maka itu akan berhasil.
Apakah Anda melakukan impor pylab di notebook IPython? Kalau tidak, semuanya harus sama.

Yah saya tidak tahu apa yang menyebabkan AttributeError... Meskipun kemungkinan besar terkait dengan joblibs, karena _it terjadi hanya ketika n_jobs lebih dari 1_, berjalan baik dengan n_jobs=1 .

Kesalahan berbicara tentang atribut score_model hilang dari __main__ , apakah saya memiliki if __name__ == '__main__' di Notebook IPython atau tidak.

(Saya menyadari bahwa baris kesalahan ditempelkan secara tidak benar di atas - saya mengeditnya di posting di atas.)

Saya tidak menggunakan pylab.

Inilah pesan kesalahan lengkap yang diperluas - http://Pastebin.com/23y5uHT2

Hum, itu kemungkinan terkait dengan masalah multiprosesor di windows. Mungkin @GaelVaroquaux atau @ogrisel bisa membantu.
Saya tidak tahu apa yang dibuat notebook dari __name__ == "__main__" .
Cobalah untuk tidak menentukan metrik di buku catatan, tetapi dalam file terpisah dan impor. Saya pikir itu akan memperbaikinya.
Ini tidak benar-benar terkait dengan GridSearchCV, tetapi beberapa interaksi menarik antara windows multiprocessing, notebook IPython, dan joblib.

teman-teman ... terima kasih untuk threadnya. Pokoknya saya harus memeriksa utas ini sebelumnya, membuang 5 jam waktu saya untuk ini. Mencoba untuk berjalan dalam pemrosesan paralel. Terima kasih banyak :)
UNTUK MENAMBAHKAN UMPAN BALIK: masih beku. Saya menghadapi masalah yang sama ketika di hadapan fungsi biaya make_Score saya sendiri..sistem saya mulai membeku. Ketika saya tidak menggunakan fungsi biaya khusus, saya tidak menghadapi pembekuan ini dalam pemrosesan paralel

Cara terbaik untuk mengubah 5 jam ini menjadi sesuatu yang berguna untuk proyek, adalah dengan memberikan contoh yang berdiri sendiri untuk mereproduksi masalah.

Saya mengalami masalah yang sama pada Windows 10 yang bekerja di notebook Jupyter mencoba menggunakan pencetak gol khusus dalam validasi silang bersarang dan n_jobs=-1. Saya menerima pesan AttributeError: Can't get attribute 'custom_scorer' on <module '__main__' (built-in)>; .
Seperti yang disarankan @amueller , mengimpor pencetak gol khusus alih-alih mendefinisikannya di buku catatan berfungsi.

Saya memiliki masalah yang sama persis pada OSX 10.10.5

Sama disini.
OSX 10.12.5

Harap berikan cuplikan kode yang dapat direproduksi. Kami akan senang untuk sampai ke dasar ini. Sulit untuk memahami tanpa kode, termasuk data, yang menunjukkan kepada kita masalahnya.

Jalankan saja baris-baris ini di shell python

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)

Perhatikan bahwa menghapus langkah PCA dari pipeline menyelesaikan masalah.

Info lebih lanjut:

Darwin-16.6.0-x86_64-i386-64bit
('Python', '2.7.13 (default, 4 Apr 2017, 08:47:57) \n[GCC 4.2.1 Kompatibel Apple LLVM 8.1.0 (clang-802.0.38)]')
('NumPy', '1.12.1')
('SciPy', '0.19.1')
('Scikit-Belajar', '0.18.2')

mengingat Anda tidak menggunakan pencetak gol khusus, haruskah kami menganggap itu sebagai
masalah terpisah?

Pada 8 Agustus 2017 18:15, "boazsh" [email protected] menulis:

Jalankan saja baris-baris ini di shell python

dari sklearn.decomposition impor PCAdari sklearn.svm impor SVCdari sklearn.preprocessing impor RobustScalerdari sklearn.metrics impor klasifikasi_laporandari sklearn.pipeline impor Pipelinedari sklearn.model_selection impor cross_val_predict

X = np.random.sample((1000, 100))
Y = np.random.sample((1000)) > 0,5
svc_pipeline = Pipa([('pca', PCA(n_components=95)), ('svc', SVC())])
prediksi = cross_val_predict(svc_pipeline, X, Y, cv=30, n_jobs=-1)print classification_report(Y, prediksi)

Perhatikan bahwa menghapus langkah PCA dari pipeline menyelesaikan masalah.

Info lebih lanjut:

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


Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320885103 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AAEz6-6Klhc67b5kZ17fFTxc8RfZQ_BWks5sWBkLgaJpZM4BkiD9
.

Ketika saya pertama kali menghadapi masalah ini saya menggunakan pencetak gol kustom, tetapi ketika mencoba untuk menyederhanakan kode contoh sebanyak mungkin, saya menemukan bahwa itu tidak harus berisi pencetak gol kustom. Setidaknya di mesin saya. Mengimpor pencetak gol juga tidak membantu dalam kasus saya. Bagaimanapun, gejalanya terlihat mirip. Script hang selamanya dan penggunaan CPU rendah.

@boazsh terima kasih banyak untuk cuplikannya, ini tidak deterministik, dapatkah Anda mengeditnya dan menggunakan np.random.RandomState untuk memastikan angka acak selalu sama pada setiap proses.

Juga ada solusi jika Anda menggunakan Python 3 yang disarankan misalnya di https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment -187683383.

Saya tidak memiliki cara untuk menguji ini di OSX saat ini tetapi saya mungkin dapat mencobanya di hari-hari mendatang.

Beberapa informasi yang berguna untuk dimiliki (cukup tambahkan apa yang hilang ke komentar Anda sebelumnya 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__)

Juga bagaimana Anda menginstal scikit-learn, dengan pip, dengan conda, dengan salah satu manajer paket OSX (brew, dll ...)?

Memperbarui cuplikan (menggunakan np.random.seed)

Darwin-16.6.0-x86_64-i386-64bit
('Python', '2.7.13 (default, 4 Apr 2017, 08:47:57) \n[GCC 4.2.1 Kompatibel Apple LLVM 8.1.0 (clang-802.0.38)]')
('NumPy', '1.12.1')
('SciPy', '0.19.1')
('Scikit-Belajar', '0.18.2')

Memperbarui cuplikan (menggunakan np.random.seed)

Besar terima kasih banyak!

Juga bagaimana Anda menginstal scikit-learn, dengan pip, dengan conda, dengan salah satu manajer paket OSX (brew, dll ...)?

Sudahkah Anda menjawab yang ini, saya tidak dapat menemukan jawaban Anda ...

Maaf, melewatkannya - pip.

FWIW, saya tidak punya masalah menjalankan cuplikan itu dengan:

platform impor; cetak(platform.platform())
Darwin-16.7.0-x86_64-i386-64bit
sistem impor; print("Python", sys.version)
Python 2.7.12 |Continuum Analytics, Inc.| (default, 2 Juli 2016, 17:43:17)
[GCC 4.2.1 (Berdasarkan Apple Inc. build 5658) (LLVM build 2336.11.00)]
impor numpy; print("NumPy", numpy.__version__)
NumPy 1.13.1
sip impor; print("SciPy", scipy.__version__)
SciPy 0.19.1
impor sklearn; print("Scikit-Belajar", sklearn.__version__)
Scikit-Belajar 0.18.2

Bisakah Anda memasukkan verbose=10 di cross_val_predict juga, sehingga kami mungkin bisa
lihat di mana itu rusak untuk Anda?

Pada 8 Agustus 2017 pukul 22:59, boazsh [email protected] menulis:

Maaf, melewatkannya - pip.


Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320948362 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AAEz67S64KIXUGvARGjvxBOw_4aCAdqhks5sWFu0gaJpZM4BkiD9
.

@jnothman Saya menduga lingkungan conda Anda menggunakan MKL dan bukan Mempercepat. Masalah pembekuan ini khusus untuk multiprosesor Accelerate dan Python. http://scikit-learn.org/stable/faq.html#why -do-i-sometime-get-a-crash-freeze-with-n-jobs-1-under-osx-or-linux untuk detail lebih lanjut .

pip di sisi lain akan menggunakan roda yang dikirimkan dengan Accelerate (pada saat penulisan).

Sebuah solusi (selain JOBLIB_START_METHOD) untuk menghindari bug khusus ini adalah dengan menggunakan MKL (misalnya melalui conda) atau OpenBLAS (misalnya melalui saluran conda-forge).

Tidak ada yang dicetak...

screen shot 2017-08-08 at 16 43 35

@jnothman Saya menduga lingkungan conda Anda menggunakan MKL dan bukan Mempercepat.

@jnothman jika Anda ingin mereproduksi masalah, IIRC Anda dapat membuat lingkungan dengan Accelerate di OSX dengan sesuatu seperti:

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

FWIW Saya tidak dapat mereproduksi masalah pada OS X VM saya. Saya mencoba meniru sedekat mungkin versi @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')

Hmm sebenarnya saya bisa mereproduksi tetapi cuplikan Anda bukan pereproduksi yang lengkap. Berikut ini cuplikan yang diperbarui:

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))

Bagaimanapun, ini adalah masalah yang diketahui dengan multiprosesor Accelerate dan Python. Work-arounds ada dan telah terdaftar di posting sebelumnya. Yang paling mudah mungkin menggunakan conda dan pastikan Anda menggunakan MKL dan bukan Accelerate.

Dalam jangka panjang (mungkin scikit-learn 0.20) masalah ini akan diselesaikan secara universal oleh backend loky baru untuk joblib: https://github.com/scikit-learn/scikit-learn/issues/7650

Memperbaiki multiprosesing yang bergantung pada versi scikit-learn adalah gejala dari masalah vendor....

Memperbaiki multiprosesing yang bergantung pada versi scikit-learn adalah gejala dari masalah vendor....

Saya baru-baru ini membaca yang berikut, yang menurut saya menarik:
https://lwn.net/Articles/730630/rss

Saya memiliki masalah serupa dengan RandomizedSearchCV; itu menggantung tanpa batas. Saya menggunakan macbook pro berusia 3 tahun, ram 16GB dan core i7 dan versi scikit-learn saya adalah 0,19.

Bagian yang membingungkan adalah bahwa itu berfungsi Jumat lalu !!! Senin pagi, saya kembali dan mencoba berlari dan itu hanya membeku. Saya tahu dari proses sebelumnya bahwa dibutuhkan sekitar 60 menit untuk menyelesaikannya, tetapi saya menunggu lebih lama dari itu dan tidak ada yang terjadi, itu hanya hang, tidak ada pesan kesalahan, tidak ada apa-apa dan komputer saya memanas dan menyedot daya seperti tidak ada hari esok. Kode di bawah ini. Saya mencoba mengubah n_iter menjadi 2 dan n_jobs=1 setelah membaca beberapa komentar di sini dan itu berhasil. Jadi mungkin ada hubungannya dengan n_jobs=-1. Namun, kode ini berfungsi dengan baik Jumat lalu! itu hanya membenci hari Senin. Ukuran dataset saya kurang dari 20k contoh dengan dimensi <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

apa itu crf? hanya untuk menghilangkan kemungkinan, bisakah kamu mencoba menggunakan
return_train_score=Salah?

Sangat mungkin bahwa masalah @KaisJM ini disebabkan oleh batasan terkenal pada Percepatan dengan multiprosesor, lihat faq kami.

Bagaimana Anda menginstal scikit-learn?

Juga untuk referensi di masa mendatang, dapatkah Anda menempelkan output dari:

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__)

ini bekerja Jumat lalu!! Saya tidak melakukan apa-apa sejak itu. Saya pikir scikit learn adalah bagian dari anaconda, tetapi saya melakukan upgrade dengan pip (pip install --upgrade sklearn), tapi itu sebelum saya mendapatkan masalah ini .. Saya menjalankan kode dengan baik setelah memutakhirkan ke 0,19.

inilah hasil cetakan di atas:

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 : Saya menggunakan RandomizedSearchCV dari sklearn.grid_search yang tidak memiliki parameter return_train_score. Saya tahu sklearn.grid_search sudah usang.. Saya akan mencoba yang dari sklearn.model_selection, tetapi sesuatu memberi tahu saya bahwa saya akan memiliki masalah yang sama persis). Komentar asli yang diperbarui dengan info dan kode lebih lanjut.

Bisakah Anda memposting output dari conda list | grep numpy . Saya akan menebak dengan liar bahwa dengan memperbarui scikit-learn dengan pip Anda juga memperbarui numpy dengan pip dan Anda mendapatkan roda numpy yang menggunakan Accelerate dan memiliki batasan yang disebutkan di atas.

Sedikit nasihat:

  • posting cuplikan yang sepenuhnya berdiri sendiri (untuk edisi Anda berikutnya). Itu berarti siapa pun dapat menyalin dan menempelkannya di sesi IPython dan dengan mudah mencoba mereproduksi. Ini akan memberi Anda peluang terbaik untuk mendapatkan umpan balik yang baik.
  • jika Anda menggunakan conda, tetap gunakan conda untuk mengelola paket yang tersedia melalui conda. Gunakan pip hanya jika perlu.
  • Jika Anda bersikeras ingin menggunakan pip install --update , saya sangat menyarankan Anda menggunakan pip install --update --no-deps . Kalau tidak, jika sebuah paket bergantung, katakan pada numpy, dan Anda kebetulan tidak memiliki numpy terbaru, numpy akan ditingkatkan dengan pip, yang tidak Anda inginkan.

Oh ya dan BTW, sklearn.grid_search sudah usang Anda mungkin ingin menggunakan sklearn.model_selection pada satu titik tidak terlalu jauh di jalan.

Saran yang bagus, terima kasih. Jadi, apakah solusi untuk menurunkan versi numpy? batasan apa yang Anda maksud? link FAQ di atas? Saya memang membacanya, tetapi saya tidak mengerti hal ini (saya hanya seorang pria algo :)).

keluaran conda list | grep numpy

numpy 1.12.0
numpy 1.12.0 py27_0
numpy 1.13.1
numpydoc 0.7.0

Wow tiga numpy terinstal Saya melihat dua sebelumnya tetapi tidak pernah tiga ... bagaimanapun ini tampaknya menunjukkan masalah yang saya sebutkan, yaitu bahwa Anda memiliki campuran pip dan conda yang merupakan ide buruk untuk paket yang diberikan.

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

Semoga setelah itu Anda akan memiliki satu numpy yang menggunakan MKL.

Jika saya jadi Anda, saya akan memeriksa ulang apakah Anda tidak memiliki masalah yang sama untuk paket ilmiah inti lainnya, misalnya scipy, dll ...

alasan saya menggunakan pip untuk beberapa paket adalah karena conda tidak memiliki beberapa paket, yang sebenarnya sangat membuat frustrasi karena saya tahu mencampur pip dengan conda adalah ide yang buruk. Lain kali itu terjadi, saya akan menggunakan opsi --no-deps.

satu hal yang harus saya sebutkan adalah bahwa saya menginstal Spyder di dalam env python tempat saya bekerja. Namun, saya dapat menjalankan kode setelah menginstal Spyder, baik di Spyder maupun di Jupyter.

Saya melakukan uninstall Spyder dan numpys di atas, menginstal ulang bergelombang dengan conda (yang memperbarui scikit ke 0,19) dan masih mendapatkan kesalahan yang sama. Sesuatu mungkin telah terjadi karena pemasangan Spyder, tetapi mengapa itu bekerja selama sehari dan kemudian tiba-tiba berhenti??

oke, tidak ada yang berhasil!! haruskah saya membuat lingkungan baru (menggunakan conda) dan menginstal ulang semuanya di sana? apakah itu akan menyelesaikannya atau memperburuknya?

Kedengarannya patut dicoba!

membuat env baru dan menginstal semuanya dengan conda, masih membeku tanpa batas. hanya satu salinan dari setiap paket dll.

n_jobs=1 berfungsi, tetapi tentu saja membutuhkan waktu lama (berfungsi di env sebelumnya juga). n_jobs=-1 adalah apa yang membeku tanpa batas.

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')

Lalu aku tidak tahu. Satu-satunya cara kami dapat menyelidiki, adalah Anda memposting cuplikan mandiri sepenuhnya yang dapat kami salin dan tempel di sesi IPython dan lihat apakah kami dapat mereproduksi masalahnya.

akan mencoba membuat contoh minimal yang mereproduksi masalah. Saya perlu melakukan itu untuk men-debug lebih efisien.

Saya membaca entri FAQ yang Anda rujuk tentang "Mempercepat".. itu tidak banyak membantu saya. Apa yang saya ambil darinya adalah panggilan fork() NOT diikuti oleh exec() itu buruk. Saya telah melakukan beberapa googling tentang ini dan sejauh ini tidak ada petunjuk tentang solusi. Bisakah Anda menunjukkan beberapa informasi lebih lanjut, lebih detail tentang apa masalahnya? Terima kasih,

Coba cuplikan ini (diambil dari 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))
  • Jika ini membeku (yaitu tidak selesai dalam satu detik) itu berarti Anda menggunakan Accelerate dan pembekuan adalah batasan yang diketahui dengan multiprosesor Python. Solusinya adalah tidak menggunakan Accelerate. Di OSX Anda dapat melakukannya dengan conda yang menggunakan MKL secara default. Anda juga dapat menggunakan OpenBLAS menggunakan conda-forge.
  • Jika tidak membeku maka Anda tidak menggunakan Accelerate, dan kami memerlukan cuplikan yang berdiri sendiri untuk menyelidikinya.

akan mencoba mereproduksi dengan kode minimal.

Without multiprocessing:
Enter
Exit

With multiprocessing:
Enter
Exit
Enter
Exit

@GaelVaroquaux scikit-learn bukan aplikasi tetapi perpustakaan di ekosistem yang kaya. Jika semua orang melakukan apa yang kita lakukan, semuanya akan runtuh. Itu sinyal yang cukup jelas bahwa kita perlu berubah. Dan ada banyak lingkungan di mana kebalikannya benar dari komentar itu.

Saya menggunakan instance virtual ubuntu di mesin komputasi awan google (bergelombang, pedas, scikit dll bukan yang terbaru). Kode berjalan dengan baik. Kemudian saya menginstal Gensim. Ini memperbarui numpy dan scipy ke versi terbaru dan menginstal beberapa hal lain yang diperlukan (boto, bz2file dan smart_open). Setelah itu kode membeku. Saya harap ini memberikan petunjuk yang berguna tentang apa yang menyebabkan pembekuan ini.

setelah menginstal Gensim
numpy (1.10.4) diperbarui ke numpy (1.13.3)
scipy (0.16.1) diperbarui menjadi scipy (0.19.1)

Info lebih lanjut:
Melakukan penelitian saya menemukan bahwa libblas, liblapack dan liblapack_atlas hilang dari /usr/lib/ saya, saya juga tidak melihat direktori /usr/lib/atlas-base/. Saya tidak tahu apakah mereka ada di sana dan menginstal gensim menghapusnya karena memperbarui numpy dll, tetapi ini mungkin karena kode berfungsi sebelum menginstal gensim. Saya menginstalnya menggunakan sudo apt-get --yes install libatlas-base-dev dan "_update-alternatives_" sesuai dengan petunjuk instalasi scikit lanjutan , tetapi tidak membantu, kode masih macet dengan n_jobs=-1.

Saya pikir masalahnya adalah numpy menggunakan OpenBlas. Akan beralih ke ATLAS dan melihat apa yang terjadi.

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

Masih masalah yang sama. Berikut ini berjalan dengan baik, kecuali saya memasukkan 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 apakah instalasi Numpy dan Scipy Anda menggunakan ATLAS atau OpenBLAS?

Agak sulit untuk mengikuti apa yang telah Anda lakukan @KaisJM. Dari sudut pandang pengelola, yang kami butuhkan adalah cuplikan python yang sepenuhnya berdiri sendiri untuk melihat apakah kami dapat mereproduksi. Jika kita dapat mereproduksi, baru kita dapat menyelidiki dan mencoba memahami apa yang terjadi. Jika itu hanya terjadi ketika Anda menginstal gensim dan Anda berhasil mereproduksi perilaku ini secara konsisten, maka kita akan memerlukan instruksi lengkap cara membuat lingkungan Python yang bermasalah vs lingkungan Python yang tidak bermasalah.

Ini membutuhkan jumlah waktu dan usaha yang tidak dapat diabaikan, saya sepenuhnya setuju, tetapi tanpa itu, saya khawatir tidak banyak yang dapat kita lakukan untuk menyelidiki masalah yang Anda hadapi.

sesuai dengan petunjuk instalasi lanjutan

@KaisJM omong-omong, halaman ini sudah ketinggalan zaman, karena saat ini roda tersedia di Linux dan berisi OpenBLAS mereka sendiri. Jika Anda menginstal scikit-learn yang dirilis dengan pip, Anda akan menggunakan OpenBLAS.

@lesteve apakah Anda mengatakan bahwa Openblas tidak menyebabkan pembekuan lagi?

@lesteve paula telah memposting cuplikan yang juga memiliki masalah yang sama. Saya dapat melihat itu bukan kode yang lengkap, tetapi saya harap ini memberi petunjuk. Saya dapat membuat cuplikan di sini "lengkap" dan memposting untuk Anda. Namun, jelas bahwa halaman petunjuk "kedaluwarsa" -seperti yang Anda sebut- mungkin tidak terlalu ketinggalan zaman. Kemungkinan tertinggi adalah bahwa OpenBLAS menyebabkan biaya yang mereka bicarakan di halaman itu.

Instruksi ini sudah ketinggalan zaman, percayalah. Jika Anda membaca secara detail, dikatakan "tetapi dapat membekukan joblib/multiprocessing sebelum OpenBLAS versi 0.2.8-4". Saya memeriksa roda numpy baru-baru ini dan itu berisi OpenBLAS 0.2.8.18. Pembekuan yang mereka maksud adalah yang ada di https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -334155175 , yang sepertinya tidak Anda miliki.

Saya dapat melihat itu bukan kode yang lengkap, tetapi saya harap ini memberi petunjuk

Tidak benar-benar tidak. Kami memiliki laporan pengguna yang tampaknya menunjukkan bahwa pembekuan masih dapat terjadi, tidak ada yang berhasil kami reproduksi AFAIK. Itu tampaknya menunjukkan, bahwa masalah ini terjadi dalam beberapa kombinasi faktor yang sangat spesifik. Kecuali seseorang yang memiliki masalah menghabiskan waktu dan mencari cara untuk mereproduksi dengan cara yang terkontrol dan kami berhasil mereproduksi, tidak ada cara kami dapat melakukan apa pun untuk itu.

Saya dapat membuat cuplikan di sini "lengkap" dan memposting untuk Anda

Itu bagus. Itu akan sangat bagus jika Anda dapat memeriksa apakah cuplikan seperti itu masih menyebabkan pembekuan di lingkungan conda yang terpisah (atau virtualenv tergantung pada apa yang Anda gunakan).

@lesteve @paulaceccon : Saya mengambil kode kutipan Paula dan membuat potongan kode lengkap yang bisa dijalankan. Cukup tempel ke sel Jupyter dan jalankan. Paula: Saya tidak bisa membekukan cuplikan ini. Perhatikan bahwa n_jobs=-1 dan berjalan dengan baik. Akan lebih bagus jika Anda dapat melihat dan memposting versi yang membeku. Perhatikan bahwa Anda dapat beralih antara modul grid_search dan modul model_selection, keduanya berjalan dengan baik untuk saya.

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 Saya pikir itu lebih berguna jika Anda mulai dari skrip pembekuan Anda dan berhasil menyederhanakan dan memposting yang sepenuhnya berdiri sendiri yang membeku untuk Anda.

@lesteve Setuju. Saya membuat lingkungan python2 baru seperti yang saya miliki sebelum menginstal Gensim. Kode berjalan dengan baik, TANPA pembekuan dengan n_jobs=-1. Terlebih lagi, Numpy menggunakan OpenBLAS dan memiliki konfigurasi yang sama dengan lingkungan yang menunjukkan pembekuan (di mana Gensim diinstal). Jadi sepertinya openblas bukan penyebab pembekuan ini.

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 Saya menjalankan cuplikan yang sama di sini (windows) dan membeku.

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_)

Saya tahu ini canggung tetapi tidak macet saat dijalankan dengan metrik _custom_.

Saya memiliki masalah serupa. Saya telah menjalankan kode yang sama dan hanya ingin memperbarui model dengan data bulan baru dan berhenti berjalan. saya percaya sklearn sementara itu diperbarui ke 0,19

Menjalankan GridSearchCV atau RandomizedSearchCV dalam satu lingkaran dan n_jobs > 1 akan diam di 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)

    ...

Mengikuti rekomendasi @lesteve & memeriksa lingkungan & menghapus numpy yang diinstal dengan pip:

Darwin-16.6.0-x86_64-i386-64bit
Python 3.6.1 |Anaconda kustom (x86_64)| (default, 11 Mei 2017, 13:04:09)
[GCC 4.2.1 Kompatibel Apple LLVM 6.0 (clang-600.0.57)]
NumPy 1.13.1
SciPy 0.19.1
Scikit-Belajar 0.19.0

$conda daftar | grep numpy
gnumpy 0,2 pip
numpy 1.13.1 py36_0
numpy 1.13.3 pip
numpydoc 0.6.0 py36_0

$pip hapus instalan numpy

$conda daftar | grep numpy
gnumpy 0,2 pip
numpy 1.13.1 py36_0
numpydoc 0.6.0 py36_0

$conda install numpy -f // kemungkinan besar tidak diperlukan

$conda daftar | grep numpy
gnumpy 0,2 pip
numpy 1.13.1 py36_0
numpydoc 0.6.0 py36_0

Memperbaiki masalah saya.

@paulaceccon masalah Anda terkait dengan

https://stackoverflow.com/questions/36533134/cant-get-attribute-abc-on-module-main-from-abc-h-py
Jika Anda mendeklarasikan kumpulan sebelum mendeklarasikan fungsi yang Anda coba gunakan secara paralel, itu akan menimbulkan kesalahan ini. Balikkan urutannya dan itu tidak akan lagi membuang kesalahan ini.

Berikut ini akan menjalankan kode Anda:

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_)

dengan 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)

Hasil berjalan pada 8 core

Pas 3 lipatan untuk masing-masing 54 kandidat, dengan total 162 pas
{'class_weight': {0: 0.51891309, 1: 13.71835531}, 'criterion': 'gini', 'min_samples_leaf': 10, 'min_samples_split': 20, 'n_estimators': 400}

Masalah masih ada guys. Saya menggunakan pencetak gol khusus dan itu terus berlangsung selamanya ketika saya mengatur n_jobs ke apa pun. Ketika saya tidak menentukan n_jobs sama sekali itu berfungsi dengan baik tetapi selain itu macet.

Bisakah Anda memberikan cuplikan yang berdiri sendiri untuk mereproduksi masalah? Silakan baca https://stackoverflow.com/help/mcve untuk detail lebih lanjut.

Masih menghadapi masalah ini dengan kode sampel yang sama.

Windows-10-10.0.15063-SP0
Python 3.6.4 | Kustom Anaconda (64-bit)| (default, 16 Jan 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]
NumPy 1.14.1
SciPy 1.0.0
Scikit-Belajar 0.19.1

Bisakah Anda memberikan cuplikan yang berdiri sendiri untuk mereproduksi masalah? Silakan baca https://stackoverflow.com/help/mcve untuk detail lebih lanjut.

Saya menduga ini adalah multiprocessing lama yang sama di masalah windows. lihat FAQ kami

Saya menguji kode di https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -337985212 .

OS: Windows 10 x64 10.0.16299.309
Paket Python: WinPython-64bit-3.6.1
numpy (1.14.2)
scikit-belajar (0.19.1)
sip (1.0.0)

Ini berfungsi dengan baik di Jupyter Notebook dan baris perintah.

HI, saya mengalami masalah yang sama, jadi saya tidak ingin membuka yang baru yang dapat mengarah ke utas yang hampir identik.

-Maco
-Anaconda
-scikit-belajar 0.19.1
-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))

Kode dari tutorial: https://machinelearningmastery.com/use-keras-deep-learning-models-scikit-learn-python/
Saya mencoba mengubah parameter n_jobs menjadi 1, -1, tetapi keduanya tidak berhasil. Ada petunjuk?

itu berjalan jika saya menambahkan impor multiproses dan pernyataan if seperti yang ditunjukkan di bawah ini - Saya tidak bekerja dengan keras jadi saya tidak memiliki lebih banyak wawasan

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))

Pas 3 lipatan untuk masing-masing dari 18 kandidat, total 54 pas

Terbaik: 0,675781 menggunakan {'batch_size': 5, 'epochs': 5, 'init': 'glorot_uniform', 'optimizer': 'adam'}
0,621094 (0,036225) dengan: {'batch_size': 5, 'epochs': 5, 'init': 'glorot_uniform', 'optimizer': 'rmsprop'}
0,675781 (0,006379) dengan: {'batch_size': 5, 'epochs': 5, 'init': 'glorot_uniform', 'optimizer': 'adam'}
...
0.651042 (0.025780) dengan: {'batch_size': 20, 'epochs': 5, 'init': 'uniform', 'optimizer': 'adam'}


info versi jika diperlukan
sys 3.6.4 |Anaconda kustom (64-bit)| (default, 16 Jan 2018, 12:04:33)
[GCC 4.2.1 Dentang Kompatibel 4.0.1 (tag/RELEASE_401/final)]
numpy 1.14.2
panda 0.22.0
sklearn 0.19.1
obor 0.4.0a0+9692519
IPython 6.2.1
keras 2.1.5

compiler : GCC 4.2.1 Kompatibel Dentang 4.0.1 (tag/RELEASE_401/final)
sistem : Darwin
rilis: 17.5.0
mesin: x86_64
prosesor: i386
Inti CPU: 24
penerjemah: 64bit

Terima kasih @thomberg1 , tetapi menambahkan

import multiprocessing
if __name__ == '__main__':

tidak membantu. Masalahnya masih sama

Masalah yang sama pada mesin saya saat menggunakan fungsi penilaian yang disesuaikan di GridsearchCV .
python 3.6.4,
scikit-belajar 0.19.1,
Windows 10.,
Inti CPU: 24

@byrony dapatkah Anda memberikan kode untuk direproduksi? apakah anda menggunakan if __name__ == "__main__" ?

Saya telah mengalami masalah serupa beberapa kali pada mesin saya saat menggunakan n_jobs=-1 atau n_jobs=8 sebagai argumen untuk GridsearchCV tetapi menggunakan argumen pencetak angka default.

  • Python 3.6.5,
  • scikit-belajar 0.19.1,
  • ArchLinux,
  • Inti CPU: 8.

Berikut adalah kode yang saya gunakan:

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()

Saya tahu ini adalah kumpulan data yang besar jadi saya berharap itu akan memakan waktu lama untuk mendapatkan hasil tetapi kemudian setelah 2 hari berjalan, itu hanya berhenti bekerja (skrip terus dijalankan tetapi tidak menggunakan sumber daya apa pun selain RAM dan swap).

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

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

Terima kasih sebelumnya!

@amueller Saya tidak menggunakan if __name__ == "__main__" . Di bawah ini adalah kode saya, ini hanya berfungsi ketika 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)

Anda menggunakan XGBoost. Saya tidak tahu apa yang mereka lakukan secara internal, sangat mungkin itu masalahnya. Bisakah Anda mencoba melihat apakah menambahkan if __name__ membantu?
Kalau tidak, saya rasa belum ada perbaikan untuk itu.

@Pazitos10 dapatkah Anda mereproduksi dengan data sintetis dan/atau data yang lebih kecil? Saya tidak dapat mereproduksi tanpa data Anda dan akan lebih baik untuk mereproduksi dalam waktu yang lebih singkat.

@amueller Ok, saya akan menjalankannya lagi dengan 500k baris dan akan memposting hasilnya. Terima kasih!

@amueller , menjalankan skrip dengan 50k baris berfungsi seperti yang diharapkan. Script berakhir dengan benar, menunjukkan hasil sebagai berikut (maaf, maksud saya 50k bukan 500k):

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

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

Masalahnya adalah saya tidak tahu apakah hasil ini akan menjadi yang terbaik untuk seluruh dataset saya. Ada saran?

Sepertinya Anda kehabisan ram. Mungkin coba gunakan Keras sebagai gantinya, kemungkinan solusi yang lebih baik untuk jaringan saraf skala besar.

@amueller Oh, oke. Saya akan mencoba menggunakan Keras sebagai gantinya. Terima kasih lagi!

Ini tidak ada hubungannya dengan pencetak gol khusus. Ini adalah fitur yang terkenal dari multiprocessing Python di Windows: Anda harus menjalankan semua yang menggunakan n_jobs=-1 dalam blok if __name__ == '__main__' atau Anda akan mendapatkan freeze/crash. Mungkin kita harus mendokumentasikan ini di suatu tempat dengan jelas, misalnya di README?

Apakah mungkin ide untuk scikit, bahwa dalam kasus Windows untuk mengubah fungsinya?
Dan gunakan antrian untuk memberi makan tugas ke kumpulan proses pekerja dan mengumpulkan hasilnya
Seperti yang dijelaskan di sini: https://docs.python.org/2/library/multiprocessing.html#windows
dan untuk 3.6 di sini: https://docs.python.org/3.6/library/multiprocessing.html#windows

@PGTBoos ini diperbaiki di scikit-learn 0.20.0

Apakah halaman ini membantu?
0 / 5 - 0 peringkat