飞谷云六期第三组——基于Spark的机器学习
项目正式开始时间:2015.10.15.
随笔内容:本次项目的主题是基于Spark的ML。对于ML的学习有大概半年了,正好在网上关注到了由上海交通大学所主办的这个飞谷云的大数据项目,我所报名的这期已经是飞谷云的第六期了,在网上和群里了解了一段时间后大算报名参与一次,毕竟之前没有参与过真正的项目开发,也刚好趁着在学习ML的这个时间通过项目把理论和实践都加强。在这篇随笔中,我打算把这次项目的每个过程都写进来,一是为了给正在进行的项目提供一个全程记录;二是给自己一个留念,毕竟是自己独立完成的一个ML方面的项目,对于今后的学习也能起到帮助作用。
飞谷云六期第三组项目需求说明(我选择的内容):
招聘信息挖掘:
1.通过公司描述、招聘岗位、薪水等对公司评级;
2.通过招聘岗位描述对岗位分类,找出岗位描述关键词。
项目交付物:
1. 代码(python)
2. 成果展示(可视化最好)
希望在项目截止的时候能达到项目组的要求。对于这次项目,我主要还是以学习为主,通过对于数据的分析掌握 数据整理、数据清洗、Spark、ML等方面的知识。
正式的项目经过:
一.登陆服务器:飞谷云测试服务器上的数据存储情况:
·Mac连接服务器步骤(到这里才真正认识到Mac之于开发的优势):
Terminal:
$ssh open@210.14.77.98
$password
$ssh 222.249.249.152
$password
·查看服务器上HDFS中的表数据:
$hadoop fs -ls
$hadoop fs -ls /user/hive/warehouse/feigu3.db 查看刚才 feigu3 数据中的所有表
$hadoop fs -cat /user/hive/warehouse/feigu3.db/stg_job/pt=20151014/liepin1.dat 打开feigu3数据中的stg_job表,查看其中任意一个文件
上图为在服务器端查看到的抓取的招聘网站的数据信息。
到2015.10.19(第一周开始)为止计划的项目流程进度:
·在Spark中所引用服务器上所用的表数据(使用Python)
·把项目需要的表数据经过清洗、规整后整合为一个数据文件(包含公司描述、招聘职位、薪水等)
·特征提取
·给ML(聚类等)算法喂入特征条件,输出最后结果
预计每周完成一个计划点。
2015.10.24(第一周结束)
·通过sftp在跳板机open@students上下载“hive-output.rar”文件,这个文件老师已经从服务器中下载到了跳板机上,虽然成功下载数据到本地,但还是想自己实现从服务器端将文件下载到本地(参考Hive编程指南)操作。
终端中输入的sftp命令如下:
sftp 用户名@远端ip :
get /目录/文件(远端) /目录/文件(本地) :
下载成功:
下一步操作:根据题目要求确定所需文件,并进行数据的转化、特征提取等数据操作。供接下来使用。
2015.10.29
在数据提取过程中遇到了阻碍,不知道应该在本地python环境下进行特征提取还是在服务器Hive上进行,所以在这周有结果的只是规划了项目总体的步骤。如下所示。
1.提取特征包括:F0,F1,F2,F3...依次对应学历、职位技能、工作地点、薪水。
2.把以上5组(其中公司规模一组还没有提取出来)特征转化为特征矩阵x*4Feature_matrix,和公司单列向量Company_matrix。
3.查找对公司评级的标准,如每个特征所占比重等,计算出a0F0+a1F1+...+a3F3 = Scores,—> Scores对应于:各个分数段(如60~70,...,95~100)—>公司级别。
4.通过Decision Tree训练部分数据得到WT模型,然后将剩余部分作为测试数据集。
5.最后,则通过维数约减等方法进行可视化。
2015.11.3(第四周开始)
终于守得云开见月明,在今天终于基本完成了特征的提取,转化为基本的特征向量。
在这个过程中,遇到的困难其实不多,而就是纠结在了如何选择提取方法上,在本地txt通过python提取特征,还是在服务器上通过Hive用HQL提取。最终放弃了后者,其中很大的原因是在一周之后还是无法正确的在Mac上安装Hadoop。从而选择了前者。其实用python提取数据是非常简单的,但不知道怎么回事,直到今天脑子才清楚起来。于是很快就完成了。
还是附上这段代码,以安慰者一周的不愉快。
# -*- coding: utf-8 -*-
'''
Created on 2015年11月2日
从dim_edu.txt、dim_job_techword.txt、dim_joblocation.txt、dim_salary.txt
中分别提取学历、职位技术、工作地点、薪水这4项特征
@author: JasonJay
'''
#解决list中文编码包
import uniout
# 提取特征方法
def extractFeatures():
#分别打开特征的txt文档
feature_edu = open('dim_edu.txt')
feature_job_techword = open('dim_job_techword.txt')
feature_joblocation = open('dim_joblocation.txt')
feature_salary = open('dim_salary.txt')
#定义四组数组,存储中间值
cache_edu = []
cache_job_techword = []
cache_joblocation = []
cache_salary = []
writeInFeatures = open('feature_matrix','w')
#读取四组特征
for line_edu in feature_edu.readlines():
feature_edu_column = line_edu.strip().split()[3]
cache_edu.append(feature_edu_column)
for line_job_techword in feature_job_techword.readlines():
feature_job_techword_column = line_job_techword.strip().split()[3]
cache_job_techword.append(feature_job_techword_column)
for line_joblocation in feature_joblocation.readlines():
feature_joblocation_column = line_joblocation.strip().split()[3]
cache_joblocation.append(feature_joblocation_column)
for line_salary in feature_salary.readlines():
feature_salary_column = line_salary.strip().split()[3]
cache_salary.append(feature_salary_column)
i=0
lengthOfFeature = len(cache_edu)
while i <= lengthOfFeature-1:
writeInFeatures.write(cache_edu[i]+'\t'+cache_job_techword[i]+'\t'+cache_joblocation[i]+'\t'+cache_salary[i])
print(cache_edu[i]+'\t'+cache_job_techword[i]+'\t'+cache_joblocation[i]+'\t'+cache_salary[i])
i+=1
writeInFeatures.close()
#提取公司名方法
def extractCompany():
name_company = open('dim_edu.txt')
write_company = open('company_matrix.txt','w')
for line_company in name_company.readlines():
company = line_company.strip().split()[2]
write_company.write(company+'\n')
print(company)
write_company.close()
if __name__ == '__main__':
# extractFeatures()
extractCompany()
结果的两个txt文档(特征值矩阵):feature_matrix.txt和company_matrix.txt
下来的步骤就很清晰明白了,将这两个文档继续清洗、处理、替换(把中文都转化为能输入进ML算法的特征向量)成标准的数学矩阵。