[AI]關於SkLearn 及其 性能問題


Scikit-Learn 使用

Scikit-Learn (sklearn) 把很多學習模型抽象好 'NB', 'KNN', 'LR', 'RF', 'DT', 'SVM', 'GBDT',可以通過統一接口返回model對象,然后對它進行fit,predict等操作。

Scikit-Learn Sample

訓練學習:

# Multinomial Naive Bayes Classifier
def naive_bayes_classifier(train_x, train_y):
    from sklearn.naive_bayes import MultinomialNB
    model = MultinomialNB(alpha=0.01)
    model.fit(train_x, train_y)
    return model

# KNN Classifier
def knn_classifier(train_x, train_y):
    from sklearn.neighbors import KNeighborsClassifier
    model = KNeighborsClassifier()
    model.fit(train_x, train_y)
    return model

# Logistic Regression Classifier
def logistic_regression_classifier(train_x, train_y):
    from sklearn.linear_model import LogisticRegression
    model = LogisticRegression(penalty='l2')
    model.fit(train_x, train_y)
    return model

# 其他模型也是類似方式: 'NB', 'KNN', 'LR', 'RF', 'DT', 'SVM', 'GBDT'

預測:

predict = model.predict(test_x)
accuracy = metrics.accuracy_score(test_y, predict)

sklearn 性能問題

跟tensorflow,darknet等庫不同,sklearn/numpy 缺省只使用CPU計算並且不支持並行。
自己寫程序通過多線程支持並行計算,有以下兩個優化:

GIL (Global Interpreter Lock 全局解釋器鎖)

雖然有兩個死循環的線程,而且有兩個物理 CPU 內核,但因為 GIL 的限制,兩個線程只是做着分時切換,總的 CPU 占用率還略低於 50%。
雖然 CPython 的線程庫封裝了操作系統的原生線程,但卻因為 GIL 的存在導致多線程不能利用多個 CPU 內核的計算能力。好在現在 Python 有了multiprocessing,C 語言擴展機制 和 ctypes,足以應付多核時代的挑戰。

GIL 與 Python 線程的糾葛

MKL(Intel® Math Kernel Library)

Numpy/Scipy可以使用MKL庫提升計算性能
Numpy+MKL Performance

Numpy+MKL不能使用pip3直接安裝,可以在下面的地址下載離線安裝包。
Numpy+MKL安裝地址

sklearn


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM