스파크 랜 덤 숲 흥 행 예측

머리말
최근 한 동안 영화 분야 의 데 이 터 를 처리 하고 있 는데 영화 흥 행 예측 은 영화 분야 데이터 모델 링 의 중요 한 모듈 이기 때문에 우 리 는 영화 데이터 에 대해 흥 행 예측 모델 링 을 했다.
전기 작업
처음에는 이 문 제 를 회귀 문제 로 보고 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%이지 만 예전 의 방법 에 비해 많이 규범화 되 었 고 결과 에 대한 분석 도 더욱 합 리 적 이지 만 예측 효 과 를 어떻게 강화 하 는 지 는 더 많은 요 소 를 고려 할 수 있다.예 를 들 어 영화 가 계속 되 는 지 등 이다.영화 사이트 의 입 소문 지수;예고 편 재생 량;웨 이 보 에 관 한 읽 기 수;바 이 두 지수 등;
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기