스파크 랜 덤 숲 흥 행 예측
최근 한 동안 영화 분야 의 데 이 터 를 처리 하고 있 는데 영화 흥 행 예측 은 영화 분야 데이터 모델 링 의 중요 한 모듈 이기 때문에 우 리 는 영화 데이터 에 대해 흥 행 예측 모델 링 을 했다.
전기 작업
처음에는 이 문 제 를 회귀 문제 로 보고 GBDT 회귀 트 리 로 만 들 었 다.서로 다른 잔 차 의 회귀 트 리 를 훈련 시 킨 다음 에 통합 학습 을 했다.고려 한 영향 요인 은 영화 의 유형,콩잎 평 점,감독의 영향력,배우 의 영향력,영화 의 제작 사가 있 었 다.그러나 예측 한 결 과 는 그리 이상 적 이지 않 았 다.정확 도 는 실제 값 의 0.3+/-구간 상황 의 80%이 며 파동 성 이 비교적 커서 해석 하기 어렵다.
후기 개선
이전의 실패 경험 을 총 결 하여 주로 다음 과 같은 몇 가 지 를 귀납 하 였 다.
1.영향 인자 가 많 지 않 아 모델 링 하기 어렵다.
2.흥 행 성적 의 구간 이 비교적 크 고(백만 에서 10 억 까지)분포 가 고 르 지 않 으 며 대부분 집중 과 억 급 이기 때문에 회귀 방법 으로 해결 하기에 적합 하지 않다.
3.데이터 견본 의 양 이 비교적 적 고 고 르 지 않 으 며 백만 급 의 영 화 를 예측 하 는 것 이 비교적 많 고 예측 결과 에 영향 을 미친다.
후기 에 우 리 는 데이터 의 입력 형식,즉 영향 요인 을 다시 규범화 시 켰 다.구체 적 으로 다음 과 같다.
영화 제목
두 번 째 줄:영화 흥 행(즉 예측 용,만 단위)
세 번 째 줄:영화 장르
네 번 째 줄:길이(분 단위)
다섯 번 째 줄:개봉 시간(월 별로)
여섯 번 째 줄:제식(일반적으로 2D,3D,IMAX 로 나 뉜 다)
제7 행:제작 국가
제8 행:감독의 영향(감독의 평균 흥 행 성적 을 기준 으로 만 단위)
제9 행:배우 영향(모든 배우 의 평균 흥 행 성적 을 기준 으로 만 단위)
열 번 째 줄:제작 사 영향(모든 제작 사의 평균 흥 행 성적 을 기준 으로 만 단위)
제1 1 행:발행 공식 영향(모든 제작 사의 평균 흥 행 성적 을 기준 으로 만 단위)
05-17 년 간 중국,일본,미국,영국 에서 온 영 화 를 수 집 했 는데 모두 1058 편의 영 화 를 수 집 했 습 니 다.처리 가 분류 문제 가 되 었 기 때문에 영화 흥 행 을 다음 과 같은 등급 으로 나 누 었 습 니 다.
모델 을 구축 하기 전에 데 이 터 를 libsvm 형식 파일 로 처리 한 다음 무 작위 삼림 모델 로 훈련 합 니 다.
랜 덤 숲 은 많은 결정 트 리 로 구성 되 어 있 습 니 다.이러한 결정 트 리 의 형성 은 랜 덤 전략 을 사용 하기 때문에 모든 결정 트 리 는 랜 덤 으로 생 성 되 고 서로 독립 됩 니 다.모델 의 마지막 수출 유형 은 모든 트 리 가 수출 하 는 유형의 중수 에 의 해 정 해 집 니 다.모든 결정 트 리 를 구축 할 때 사용 하 는 전략 은 정보 엔트로피 입 니 다.결정 트 리 는 다 원 화 된 분류 결정 트 리 입 니 다.랜 덤 숲 의 절차 도 는 다음 과 같 습 니 다.
랜 덤 숲 은 spark-mllib 가 제공 하 는 random forest 로 10 억 이 넘 는 영화 의 데이터 가 상대 적 으로 적 기 때문에 각 데이터 의 분 포 를 균형 시 키 기 위해 지나치게 표본 을 추출 하 는 방법 을 사용 했다.훈련 모델 의 코드 는 다음 과 같다.
public void predict() throws IOException{
SparkConf conf = new SparkConf().setAppName("SVM").setMaster("local");
conf.set("spark.testing.memory", "2147480000");
SparkContext sc = new SparkContext(conf);
SQLContext sqlContext = new SQLContext(sc);
// Load and parse the data file, converting it to a DataFrame.
DataFrame trainData = sqlContext.read().format("libsvm").load(this.trainFile);
DataFrame testData = sqlContext.read().format("libsvm").load(this.testFile);
// Index labels, adding metadata to the label column.
// Fit on whole dataset to include all labels in index.
StringIndexerModel labelIndexer = new StringIndexer()
.setInputCol("label")
.setOutputCol("indexedLabel")
.fit(trainData);
// Automatically identify categorical features, and index them.
// Set maxCategories so features with > 4 distinct values are treated as continuous.
VectorIndexerModel featureIndexer = new VectorIndexer()
.setInputCol("features")
.setOutputCol("indexedFeatures")
.setMaxCategories(4)
.fit(trainData);
// Split the data into training and test sets (30% held out for testing)
// DataFrame[] splits = trainData.randomSplit(new double[] {0.9, 0.1});
// trainData = splits[0];
// testData = splits[1];
// Train a RandomForest model.
RandomForestClassifier rf = new RandomForestClassifier()
.setLabelCol("indexedLabel")
.setFeaturesCol("indexedFeatures")
.setNumTrees(20);
// Convert indexed labels back to original labels.
IndexToString labelConverter = new IndexToString()
.setInputCol("prediction")
.setOutputCol("predictedLabel")
.setLabels(labelIndexer.labels());
// Chain indexers and forest in a Pipeline
Pipeline pipeline = new Pipeline()
.setStages(new PipelineStage[] {labelIndexer, featureIndexer, rf, labelConverter});
// Train model. This also runs the indexers.
PipelineModel model = pipeline.fit(trainData);
// Make predictions.
DataFrame predictions = model.transform(testData);
// Select example rows to display.
predictions.select("predictedLabel", "label", "features").show(200);
// Select (prediction, true label) and compute test error
MulticlassClassificationEvaluator evaluator = new MulticlassClassificationEvaluator()
.setLabelCol("indexedLabel")
.setPredictionCol("prediction")
.setMetricName("precision");
double accuracy = evaluator.evaluate(predictions);
System.out.println("Test Error = " + (1.0 - accuracy));
RandomForestClassificationModel rfModel = (RandomForestClassificationModel)(model.stages()[2]);
// System.out.println("Learned classification forest model:
" + rfModel.toDebugString());
DataFrame resultDF = predictions.select("predictedLabel");
JavaRDD<Row> resultRow = resultDF.toJavaRDD();
JavaRDD<String> result = resultRow.map(new Result());
this.resultList = result.collect();
for(String one: resultList){
System.out.println(one);
}
}
다음은 그 중의 결정 트 리 상황 입 니 다.
Tree 16 (weight 1.0):
If (feature 10 in {0.0})
If (feature 48 <= 110.0)
If (feature 86 <= 13698.87)
If (feature 21 in {0.0})
If (feature 54 in {0.0})
Predict: 0.0
Else (feature 54 not in {0.0})
Predict: 1.0
Else (feature 21 not in {0.0})
Predict: 0.0
Else (feature 86 > 13698.87)
If (feature 21 in {0.0})
If (feature 85 <= 39646.9)
Predict: 2.0
Else (feature 85 > 39646.9)
Predict: 3.0
Else (feature 21 not in {0.0})
Predict: 3.0
Else (feature 48 > 110.0)
If (feature 85 <= 15003.3)
If (feature 9 in {0.0})
If (feature 54 in {0.0})
Predict: 0.0
Else (feature 54 not in {0.0})
Predict: 2.0
Else (feature 9 not in {0.0})
Predict: 2.0
Else (feature 85 > 15003.3)
If (feature 65 in {0.0})
If (feature 85 <= 66065.0)
Predict: 3.0
Else (feature 85 > 66065.0)
Predict: 2.0
Else (feature 65 not in {0.0})
Predict: 3.0
Else (feature 10 not in {0.0})
If (feature 51 in {0.0})
If (feature 85 <= 6958.4)
If (feature 11 in {0.0})
If (feature 50 <= 1.0)
Predict: 1.0
Else (feature 50 > 1.0)
Predict: 0.0
Else (feature 11 not in {0.0})
Predict: 0.0
Else (feature 85 > 6958.4)
If (feature 5 in {0.0})
If (feature 4 in {0.0})
Predict: 3.0
Else (feature 4 not in {0.0})
Predict: 1.0
Else (feature 5 not in {0.0})
Predict: 2.0
Else (feature 51 not in {0.0})
If (feature 48 <= 148.0)
If (feature 0 in {0.0})
If (feature 6 in {0.0})
Predict: 2.0
Else (feature 6 not in {0.0})
Predict: 0.0
Else (feature 0 not in {0.0})
If (feature 50 <= 4.0)
Predict: 2.0
Else (feature 50 > 4.0)
Predict: 3.0
Else (feature 48 > 148.0)
If (feature 9 in {0.0})
If (feature 49 <= 3.0)
Predict: 2.0
Else (feature 49 > 3.0)
Predict: 0.0
Else (feature 9 not in {0.0})
If (feature 36 in {0.0})
Predict: 3.0
Else (feature 36 not in {0.0})
Predict: 2.0
후기이 모델 이 예측 한 평균 정확 도 는 80%이지 만 예전 의 방법 에 비해 많이 규범화 되 었 고 결과 에 대한 분석 도 더욱 합 리 적 이지 만 예측 효 과 를 어떻게 강화 하 는 지 는 더 많은 요 소 를 고려 할 수 있다.예 를 들 어 영화 가 계속 되 는 지 등 이다.영화 사이트 의 입 소문 지수;예고 편 재생 량;웨 이 보 에 관 한 읽 기 수;바 이 두 지수 등;
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spark Streaming의 통계 소켓 단어 수1. socket 단어 수 통계 TCP 소켓의 데이터 서버에서 수신한 텍스트 데이터의 단어 수입니다. 2. maven 설정 3. 프로그래밍 코드 입력 내용 결과 내보내기...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.