0

내 멀티 레이어 퍼셉트론 분류기를 교육하고 있습니다. 여기 내 훈련 세트가 있습니다. 기능은 스파 스 벡터 형식입니다. 모든희소 벡터가있는 데이터 프레임을 사용하여 교차 유효성을 조정할 수 있습니까?

df_train.show(10,False) 
+------+---------------------------+ 
|target|features     | 
+------+---------------------------+ 
|1.0 |(5,[0,1],[164.0,520.0]) | 
|1.0 |[519.0,2723.0,0.0,3.0,4.0] | 
|1.0 |(5,[0,1],[2868.0,928.0]) | 
|0.0 |(5,[0,1],[57.0,2715.0]) | 
|1.0 |[1241.0,2104.0,0.0,0.0,2.0]| 
|1.0 |[3365.0,217.0,0.0,0.0,2.0] | 
|1.0 |[60.0,1528.0,4.0,8.0,7.0] | 
|1.0 |[396.0,3810.0,0.0,0.0,2.0] | 
|1.0 |(5,[0,1],[905.0,2476.0]) | 
|1.0 |(5,[0,1],[905.0,1246.0]) | 
+------+---------------------------+ 

주먹, 나는 버틸 방법에 내 추정을 평가하려면, 여기 내 코드입니다 :

from pyspark.ml.classification import MultilayerPerceptronClassifier 
from pyspark.ml.evaluation import MulticlassClassificationEvaluator 

layers = [4, 5, 4, 3] 
trainer = MultilayerPerceptronClassifier(maxIter=100, layers=layers, blockSize=128, seed=1234) 
param = trainer.setParams(featuresCol = "features",labelCol="target") 

train,test = df_train.randomSplit([0.8, 0.2]) 
model = trainer.fit(train) 
result = model.transform(test) 
evaluator = MulticlassClassificationEvaluator(
    labelCol="target", predictionCol="prediction", metricName="accuracy") 
print("Test set accuracy = " + str(evaluator.evaluate(result))) 

그러나 오류 밝혀 : 사용자 정의 함수를 실행하지 못했습니다를 ($ anonfun $ 1 : (vector) => double). 내 기능에 희소 벡터가 있기 때문에이게 맞습니까? 내가 무엇을 할 수 있습니까?

그리고 교차 검증 부분에 대한

, 나는 다음과 같은 코드 :

X=df_train.select("features").collect() 
y=df_train.select("target").collect() 
from sklearn.model_selection import cross_val_score,KFold 
k_fold = KFold(n_splits=10, random_state=None, shuffle=False) 
print(cross_val_score(trainer, X, y, cv=k_fold, n_jobs=1,scoring="accuracy")) 

를 내가 얻을 : 그것은 'get_params'메소드를 구현하지 않는 scikit 배울 추정 될 것 같지 않습니다 . 하지만 문서를 조회 할 때 get_params 메소드를 찾지 못했습니다. 누군가 나를 도와 줄 수 있습니까? (실제로 별도의 문제이다) 두 번째 부분에 초점을

답변

1
질문에 문제의 숫자가있다

...

는, 그

it does not seem to be a scikit-learn estimator

즉, 오류 메시지의 주장은 참으로 당신이 MultilayerPerceptronClassifier을 (이 아니고과 호환 됨)의 trainer으로 PySpark ML에서 사용하고 있기 때문에 정확합니다.

은 또한 당신의 두번째 코드는 전혀 PySpark 같은 아니지만, scikit는 배우기와 같은 : 당신이 하나의 기능으로, 당신의 1 조각 (A 단일 2 열 dataframe에 올바르게 입력을 사용하는 동안 열 및 레이블/타깃에있는 레이블/목표)를 사용하는 경우 두 번째 스 니펫에서이 레슨을 잊어 버린 것처럼 보입니다. 두 번째 스 니펫에서는 구분자에 대한 입력으로 별도의 데이터 프레임 Xy을 작성합니다 (scikit-learn의 경우에 해당하지만 PySpark에서는 그렇지 않음).). 정확한 사용법에 대한 간단한 예는 CrossValidator docs을 참조하십시오.

보다 일반적인 관점에서

: 데이터가 메인 메모리에 들어있는 경우 (당신이 당신의 이력서를 위해 할 당신이 그들을 collect 수 있습니다 즉)이 ML 스파크 귀찮게하는 절대적 이유가 없다, 당신은 멀리 것 scikit-learn을 사용하면 더 좋습니다.

- 1 부분에 대해서는

: 당신이 표시 한 데이터는이 라벨 0.0/1.0을 갖고있는 것 같다; 당신이 단지 10 개의 레코드를 보여주기 때문에 확신 할 수는 없지만 실제로 레이블이 2 개 밖에 없다면 MulticlassClassificationEvaluator을 사용하지 말고 BinaryClassificationEvaluator을 사용해야합니다 - 그러나 metricName="accuracy" 옵션은 없습니다 ... [편집 : 모든 확률에 대해 MulticlassClassificationEvaluator 실제로 바이너리 분류 작업을 할 수 있으며 바이너리 부분과 함께 제공되지 않는 정확도를 얻는 편리한 방법입니다!]

하지만이 이유는 (012W는 evaluator과 아무 관련이 없습니다. result.show() 또는 result.collect()). 오류의 원인은 입력 벡터가 분명히 5 차원 인 동안 첫 번째 레이어 (layers[0])의 노드 수가 4 개라는 것입니다. docs에서 :

Number of inputs has to be equal to the size of feature vectors

5-layers[0] 변경 문제 (도시되지 않음)를 해결합니다. 마찬가지로 실제로 클래스가 2 개뿐 인 경우 layers[-1]을 2로 변경해야합니다 (그렇지 않은 경우 오류는 발생하지 않지만 분류 관점에서는 그다지 의미가 없습니다).

+1

고맙습니다. part1 및 part2의 문제가 귀하가 언급 한 것과 정확히 일치 함을 보여줍니다. 이제 나는 그들 모두를 풀어 봤다. 고맙다. –

+0

@BobbyHuang 대단히 환영합니다. – desertnaut