1 Câu hỏi: Gọi hàm sklearn2pmml () trong Python 3.6 sẽ ném RuntimeError

câu hỏi được tạo ra tại Tue, Apr 30, 2019 12:00 AM

Tôi đang cố lưu đối tượng Đường ống dưới dạng PMML và Python ném RuntimeError.

Phiên bản Python của tôi là 3.6, sklearn2pmml phiên bản là 0.44.0 và phiên bản JDK là 1.8.0_201.

Tất cả những điều này phù hợp với điều kiện tiên quyết của gói.

Đây là những gì tôi đã làm cho đến nay. (Tôi không bao gồm phần tải và làm sạch dữ liệu)

from sklearn2pmml.pipeline import PMMLPipeline
from sklearn2pmml import make_pmml_pipeline, sklearn2pmml

logit_pipline = Pipeline([('vect', CountVectorizer(ngram_range=(1,2))), ('tfidf', TfidfTransformer(use_idf=True)), ('clf', LogisticRegression(C=11.3))])
pmml_pipeline = PMMLPipeline([("logit", logit_pipline)])
pmml_pipeline.fit(X, Y)

sklearn2pmml(pmml_pipeline, 'logit.pmml', with_repr=True)

Điều gì xảy ra sau khi tôi chạy dòng cuối cùng được đề cập ở trên là ...

sklearn2pmml(pmml_pipeline, 'logit.pmml', with_repr=True)
Standard output is empty
Standard error:
Apr 30, 2019 11:59:04 AM org.jpmml.sklearn.Main run
INFO: Parsing PKL..
Apr 30, 2019 11:59:04 AM org.jpmml.sklearn.Main run
INFO: Parsed PKL in 230 ms.
Apr 30, 2019 11:59:04 AM org.jpmml.sklearn.Main run
INFO: Converting..
Apr 30, 2019 11:59:04 AM org.jpmml.sklearn.Main run
SEVERE: Failed to convert
java.lang.IllegalArgumentException: Expected an estimator object as the last step, got a transformer object (Python class sklearn.pipeline.Pipeline)
        at sklearn2pmml.pipeline.PMMLPipeline.getEstimator(PMMLPipeline.java:541)
        at sklearn2pmml.pipeline.PMMLPipeline.encodePMML(PMMLPipeline.java:93)
        at org.jpmml.sklearn.Main.run(Main.java:145)
        at org.jpmml.sklearn.Main.main(Main.java:94)

Exception in thread "main" java.lang.IllegalArgumentException: Expected an estimator object as the last step, got a transformer object (Python class sklearn.pipeline.Pipeline)
        at sklearn2pmml.pipeline.PMMLPipeline.getEstimator(PMMLPipeline.java:541)
        at sklearn2pmml.pipeline.PMMLPipeline.encodePMML(PMMLPipeline.java:93)
        at org.jpmml.sklearn.Main.run(Main.java:145)
        at org.jpmml.sklearn.Main.main(Main.java:94)

Traceback (most recent call last):

  File "<ipython-input-129-f5c307b4aaba>", line 1, in <module>
    sklearn2pmml(pmml_pipeline, 'logit.pmml', with_repr=True)

  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn2pmml\__init__.py", line 252, in sklearn2pmml
    raise RuntimeError("The JPMML-SkLearn conversion application has failed. The Java executable should have printed more information about the failure into its standard output and/or standard error streams")

RuntimeError: The JPMML-SkLearn conversion application has failed. The Java executable should have printed more information about the failure into its standard output and/or standard error streams

Bây giờ theo một số người, đây là một số vấn đề tương thích JDK và việc sử dụng các phiên bản JDK 1.9 trở lên hoặc 1.6 trở xuống sẽ gây ra loại vấn đề này. Nhưng vì phiên bản JDK của tôi được sklearn2pmml chấp nhận, tại sao loại lỗi này lại xuất hiện?

    
2
  1. Câu hỏi rất hay cho người mới! Hy vọng ai đó đến và làm sáng tỏ điều đó.
    2019-04-30 07: 18: 35Z
  2. Nếu không biết tệp "logit.pmml" của bạn, một câu trả lời không có khả năng lắm. Tôi nghĩ rằng thiếu một số cấu hình /bước trong tệp này.
    2019-04-30 08: 47: 26Z
1 Đáp án                              1                         

Như ngoại lệ Java cơ bản cho biết, lớp sklearn2pmml.pipeline.PMMLPipeline dự kiến ​​sẽ được tham số hóa với một danh sách các bước, trong đó bước cuối cùng chứa một số đối tượng ước tính. Trong trường hợp của bạn, bạn đang tham số hóa PMMLPipeline với danh sách các bước đơn yếu tố; bước cuối cùng giữ một đối tượng Pipeline, không phải là một đối tượng ước tính theo nghĩa này.

Để khắc phục sự cố, chỉ cần thoát khỏi lớp logit_pipline trung gian (ý tưởng của việc bọc một đường ống bên trong đường ống là gì?).

Ví dụ: điều này sẽ hoạt động:

logit_pipline = PMMLPipeline([..])
logit_pipeline.fit(X, y)
sklearn2pmml(logit_pipeline, "logit.pmml")

Vấn đề này hoàn toàn không liên quan đến phiên bản JDK, Python hoặc Scikit-Learn.

    
0
2019-04-30 11: 39: 21Z
  1. Tôi đang gặp lỗi tương tự ngay cả sau khi thực hiện các thay đổi bạn đề xuất.
    2019-04-30 12: 09: 15Z
  2. Vì vậy, bạn vẫn có một đường ống được lồng bên trong một đường ống khác? Chỉ cần thoát khỏi một trong hai đường ống đó (logit_pipline hoặc pmml_pipeline) và thay đổi loại "người sống sót" thành PMMLPipeline.
    2019-04-30 12: 49: 54Z
  3. Tôi đã thoát khỏi đường ống lồng nhau và cố gắng chạy mã. Tôi vẫn nhận được cùng một lỗi.
    2019-05-02 05: 32: 46Z
  4. Không thể có cùng một lỗi, vì lỗi này là về một đường ống được lồng bên trong đường ống khác. Đó là một lỗi khác nhau hoặc bạn vẫn có hai đường ống dẫn. Hiển thị mã của bạn.
    2019-05-02 07: 39: 05Z
  5. Có, bạn đúng. Lỗi của tôi. Tôi đang gặp lỗi liên quan đến CountVectorizer. logit_pipeline = PMMLPipeline ([('vect', CountVectorizer (ngram_range = (1,2))), ('tfidf', TfidfTransformer (use_idf = True)), ('clf', LogisticRegression .fit (X, y) sklearn2pmml (logit_pipeline, 'logit.pmml') SEVERE: Không thể chuyển đổi java.lang.IllegalArgumentException: Thuộc tính 'sklearn.feature_extraction.text.CountVectorizer.t /div>
    2019-05-02 08: 37: 21Z
nguồn đặt đây