mahout 원본 분석의 Decision Forest 3부작의 3Test Forest
6272 단어 Mahout
먼저 TestForest를 호출하는 코드를 붙입니다. (win7 아래 myeclipse에서 TestForest를 호출합니다. 여기는Configuration을 설정해야 하기 때문에 TestForest.main () 을 직접 호출할 수 없습니다.
package mahout.fansy.partial.test;
import org.apache.hadoop.conf.Configuration;
import org.apache.mahout.classifier.df.mapreduce.TestForest;
public class TestTestForest {
/**
* TestForest
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String[] arg=new String[]{"-i","hdfs://ubuntu:9000/user/breiman/input/glass.data",
"-ds","hdfs://ubuntu:9000/user/breiman/glass.info",
"-m","hdfs://ubuntu:9000/user/breiman/glass.tree/forest.seq",
"-a","-mr",
"-o","hdfs://ubuntu:9000/user/breiman/out-testforest0"};
Configuration conf=new Configuration();
conf.set("mapred.job.tracker", "ubuntu:9001");
// conf.set("fs.default.name", "hdfs://");
conf.set("fs.default.name", "ubuntu:9000");
TestForest tf=new TestForest();
tf.setConf(conf);
Configuration confq=tf.getConf();
System.out.println(confq);
tf.run(arg);
}
}
뛰쳐나온 결과는 다음과 같다.13/09/25 00:14:51 INFO common.HadoopUtil: Deleting hdfs://ubuntu:9000/user/breiman/out-testforest0/mappers
13/09/25 00:14:51 INFO mapreduce.TestForest: =======================================================
Summary
-------------------------------------------------------
Correctly Classified Instances : 208 97.1963%
Incorrectly Classified Instances : 6 2.8037%
Total Classified Instances : 214
=======================================================
Confusion Matrix
-------------------------------------------------------
a b c d e f <--Classified as
15 0 2 0 0 0 | 17 a = 3
0 76 0 0 0 0 | 76 b = 2
0 2 68 0 0 0 | 70 c = 1
0 0 1 28 0 0 | 29 d = 7
0 0 0 0 9 0 | 9 e = 6
0 0 0 1 0 12 | 13 f = 5
mahout 원본이 Job 작업 실행이 끝난 후에 마퍼의 출력을 삭제하고 파일을 저장한 것을 볼 수 있다(이것은 원본에서 볼 수 있다).그 다음은 정확도입니다. 정확도가 97%에 이르렀음을 알 수 있습니다. 괜찮죠. 원시 데이터에 대한 분류이기 때문에 이렇게 높은 것도 정상입니다.이것은 지난번에 분석한 베일스와 같지 않다. 베일스 알고리즘은 데이터를 자동으로 두 부분으로 나누는 기능(한 훈련, 한 테스트)이 있는데 이 알고리즘은 없다.다음은 코드를 살펴보겠습니다.
TestForest에 들어가는run 방법에는 처음에는 기본 매개 변수의 설정이 있습니다.주로 입력, 출력(이것이 가장 기본적인 것), 데이터셋 경로, 모델 경로(BuildForest의 경로), 분석 결과(위의 Summary 부분), 마프리듀스 모드로 실행되는지 여부가 있다.
그런 다음 테스트 포레스트 () 방법에 들어갑니다.들어간 후 먼저 output이 요구에 부합되는지 확인하십시오. (존재하는지, 존재하면 이상을 던집니다.)다음은 모델 경로의 판단입니다. 버퍼링 이상이 없습니다.마지막으로 입력 데이터의 존재 여부를 판단한다(땀, 입력 데이터의 존재 여부를 먼저 판독해야 하지 않겠는가? 그러나 이 세 가지는 모두 판단해야 할 것 같으니 그게 먼저고 나중에 괜찮겠지).
이어서 (원래 나는 다음에 쳤는데 갑자기 앞에 이미 뒤에 있는 것을 발견하고 뒤로 물러났다. 이어서 땀을 흘렸다. 나는 이 구절을 쳤다. 그래, 또 많이 친 것 같아) 바로 마프리듀스(mapreduce) 함수다.
여기에는 분석 내용은 물론이고 당분간 잡 얘기만 하고 잡의 호출은 두 마디밖에 없다.
Classifier classifier = new Classifier(modelPath, dataPath, datasetPath, outputPath, getConf());
classifier.run();
새 Classifier 한 마디,run 방법 한 마디.새 대상은 기본적으로 무시할 수 있습니다.run 방법을 보십시오.DistributedCache.addCacheFile(datasetPath.toUri(), conf);
log.info("Adding the decision forest to the DistributedCache");
DistributedCache.addCacheFile(forestPath.toUri(), conf);
Job job = new Job(conf, "decision forest classifier");
log.info("Configuring the job...");
configureJob(job);
log.info("Running the job...");
if (!job.waitForCompletion(true)) {
throw new IllegalStateException("Job failed!");
}
먼저 데이터셋과 모델의 경로를 각각 메모리에 추가하여 Job의 Mapper 호출을 편리하게 한 다음configure Job을 선택한 다음에 바로 Job을 뛰었다.waitForCompletion(true);.다음은 configureJob의 내용입니다.job.setJarByClass(Classifier.class);
FileInputFormat.setInputPaths(job, inputPath);
FileOutputFormat.setOutputPath(job, mappersOutputPath);
job.setOutputKeyClass(DoubleWritable.class);
job.setOutputValueClass(Text.class);
job.setMapperClass(CMapper.class);
job.setNumReduceTasks(0); // no reducers
job.setInputFormatClass(CTextInputFormat.class);
job.setOutputFormatClass(SequenceFileOutputFormat.class);
기본적으로 일반적인 설정을 보았는데 Mapper가 CMapper이고 Reducer가 없었다.Cmapper가 어떻게 작동하는지 확인합니다.setup 함수 기본 코드는 세 줄입니다.
dataset = Dataset.load(conf, new Path(files[0].getPath()));
converter = new DataConverter(dataset);
forest = DecisionForest.load(conf, new Path(files[1].getPath()));
데이터셋,converter,forest를 각각 설정했는데 사실은 경로에서 파일을 읽을 뿐입니다.map 함수:
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
if (first) {
FileSplit split = (FileSplit) context.getInputSplit();
Path path = split.getPath(); // current split path
lvalue.set(path.getName());
lkey.set(key.get());
context.write(lkey, lvalue);
first = false;
}
String line = value.toString();
if (!line.isEmpty()) {
Instance instance = converter.convert(line);
double prediction = forest.classify(dataset, rng, instance);
lkey.set(dataset.getLabel(instance));
lvalue.set(Double.toString(prediction));
context.write(lkey, lvalue);
}
}
우선if의 판단이 무엇인지 모르겠습니다. 이것은 출력 파일을 봐야 합니다. (출력 파일이 원본 코드에 의해 삭제되었지만 어렵지 않습니다. 삭제하기 전에 단점을 설정하면 됩니다. 이것은 다음에 분석해야 합니다.)그리고 입력이 비어 있는지 판단합니다. 그렇지 않으면 converter에서 입력한 줄을 Instance 변수로 바꾸고 setup 함수에서 읽은forest에서 이 Instance를 분석해서 어느 종류에 속하는지 확인하고 키를 instance의 원래 분류로 설정합니다.value 설정은forest의 분류 결과입니다.여기서 가장 중요한 조작은 사실forest입니다.classify 함수:
여기서 먼저 간단명료하게 말하고 다음에 다시 상세하게 분석합시다.앞에서 얻은 포레스트에는 여러 그루의 나무가 있잖아요. (이것은 스스로 설정할 수 있는) 그리고 나무마다 이 인스타그램을 분석해서 분류 결과를 얻은 다음에 이 분류 결과가 가장 많이 반복되는 것을 취하면 돼요.됐어, 눈이 필요해...
나누다
전재는 블로그 주소를 밝혀 주십시오. http://blog.csdn.net/fansy1990
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
mahout 원본 분석의 Decision Forest 3부작의 3Test Forest먼저 TestForest를 호출하는 코드를 붙입니다. mahout 원본이 Job 작업 실행이 끝난 후에 마퍼의 출력을 삭제하고 파일을 저장한 것을 볼 수 있다(이것은 원본에서 볼 수 있다).그 다음은 정확도입니다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.