From 8daec32ca2fb85c809d9ddff1a0630d9563df6df Mon Sep 17 00:00:00 2001 From: StarLee Date: Wed, 15 Jun 2016 00:24:15 +0800 Subject: [PATCH] logisticreg code is done --- Logistic_regression.tex | 13 +++++++++---- logisticReg_HWR.py | 42 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 logisticReg_HWR.py diff --git a/Logistic_regression.tex b/Logistic_regression.tex index 283cfdf..28bed07 100644 --- a/Logistic_regression.tex +++ b/Logistic_regression.tex @@ -21,10 +21,6 @@ \begin{document} \maketitle - -\section{实际问题-手写识别} -手写识别(Handwriting recognition)是计算机在纸、照片、触摸屏或其他设备中接收并识别人手写的文字等信息的技术,主要应用于光学字符识别(OCR)。手写识别系统能够用来识别汉字、英语、数字等字符。不过本报告的重点不在手写识别,而在于理解MLlib中的logistic回归,因此以识别数字为例。识别数字0~9是个十类别问题,logistic回归最常用的场景是二分类,如果要用logistic回归解决这个问题,要采用one-against-one和one-against-all等做法进行处理,虽然复杂些,但是基本原理是一样的。因此本报告把主要关注点放在对MLlib算法的研究,只利用0和1的样本从而解决二分类问题。 - \section{MLlib相关概念} 在MLlib中有许多的概念,其中对理解其算法比较重要的有:\emph{DataFrame},\emph{Pipeline},\emph{Transfromer}和\emph{Estimator}。 @@ -36,10 +32,19 @@ \end{itemize} 一个比较简单形象的例子就是文本文档的处理,如下图*所示,上面一行表示了一个包含3个stage的Pipeline,前两个Tokenizer和HashingTF是Transformer,第三个LogisticRegression是一个Estimer。下面一行是一个流经pipeline的数据流,圆柱体代表了DataFrame.当调用pipeline的fit()方法时, Tokenizer.transform() 把原始的Raw text切分成单词,然后把这些单词添加到原DataFrame中形成新的DataFrame从而让HashingTF.transfore()进行处理,他把单词列转化成特征矩阵又添加到新的DataFrame中,最后通过 LogisticRegression.fit()方法产生LogisticRegressionModel。生成的模型可以用于后续的测试等。 + \begin{figure}[h!] \centering \includegraphics[width=16cm]{pipeline.jpg} \caption{MLlib pipeline} \label{pipeline} \end{figure} + + +\section{问题求解} +手写识别(Handwriting recognition)是计算机在纸、照片、触摸屏或其他设备中接收并识别人手写的文字等信息的技术,主要应用于光学字符识别(OCR)。手写识别系统能够用来识别汉字、英语、数字等字符。不过本报告的重点不在手写识别,而在于理解MLlib中的logistic回归,因此以识别数字为例。识别数字0~9是个十类别问题,logistic回归最常用的场景是二分类,如果要用logistic回归解决这个问题,要采用one-against-one和one-against-all等做法进行处理,虽然复杂些,但是基本原理是一样的。因此本报告把主要关注点放在对MLlib算法的研究,只利用0和1的样本从而解决二分类问题。 + +\subsection{数据集} + +sdfsdf \end{document} diff --git a/logisticReg_HWR.py b/logisticReg_HWR.py new file mode 100644 index 0000000..085dcdd --- /dev/null +++ b/logisticReg_HWR.py @@ -0,0 +1,42 @@ +from pyspark import SparkContext +from pyspark.sql import SQLContext +from pyspark.ml.classification import LogisticRegression +from pyspark.mllib.linalg import Vectors +from os import listdir +from pyspark.ml.evaluation import BinaryClassificationEvaluator +sc = SparkContext(appName="PythonlogExample") +sqlContext = SQLContext(sc) + +def load_data(data_folder): + file_list=listdir(data_folder) + file_num=len(file_list) + datas = list() + for i in range(file_num): + filename=file_list[i] + fr=open('%s/%s' %(data_folder,filename)) + data_in_line = list() + for j in range(32): + line_str=fr.readline() + for k in range(32): + data_in_line.append(int(line_str[k])) + + + label = filename.split('.')[0].split("_")[0] + # print "file:%s,label is %s"%(filename,label) + datas.append((float(label),Vectors.dense(data_in_line))) + + return sqlContext.createDataFrame(datas,["label","features"]) + +if __name__ == "__main__": + train_df = load_data("train") + + lr = LogisticRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8) + lrModel = lr.fit(train_df) + + test_df = load_data("test") + predictions = lrModel.transform(test_df) + #predictions.select("prediction","label").show(5) + + evaluator = BinaryClassificationEvaluator(labelCol="label", rawPredictionCol="rawPrediction", metricName="areaUnderPR") + accuracy = evaluator.evaluate(predictions) + print("Test Error = %g " % (1.0 - accuracy))