来自:数据工程师成长之路
作者:清雨影
链接:www.cnblogs.com/TsingJyujing/p/6549780.html
前言
最近迷上了看黄片(大雾)。每次总是去搜索想看的片子,什么asian porn anal pussy 什么的我都不知道。
搜索着搜索着我
手也累了
,而且我喜欢的片子也是有一定的特征的,我不想把所有的时间花费在重复劳动上,于是决定让机器帮我……找出喜欢的片子。
(所有代码都在Github上了,文中不放出全部代码了,实在太冗长了)
代码在此:
https://github.com/TsingJyujing/xhamster_analysis
我连表结构(CREATE TABLE的SQL语句)都放上去了啊同志们!!!所以我打这么厚的马赛克你么你也得原谅我啊!!!!
主要的代码是这个:
https://github.com/TsingJyujing/xhamster_analysis/blob/master/PornDataAnalysis.ipynb
PS:最近准备找新东家,有没有公司愿意养我这个喜欢喝咖啡的老不正经,我保证用从硬到软的强大的原型开发能力给你一个HUG。
简历见:https://github.com/TsingJyujing/Resume/blob/master/README.md
原始数据的采集
首先是原始数据的收集,我随机收集了大约30万部片子,包括标签,下载链接,标题,时长,好评率等等。
使用的代码是这个:
https://github.com/TsingJyujing/DataSpider
自己写的一个数据获取的API,xhamster也是好脾气,我爬取的过程中并没有遭到限速或者封IP之类的问题。关于爬虫的编写,在这里不是重点,可以回去自己补设计模式和并发的课。
数据的预处理
首先最重要的是我为300~400部电影打了分,打分的方式是建立一个django网站,随机抽取一些片子,显示其预览图并且给我打分的选项,源代码也已经公开了。说实话,打分完成以后看太阳都是绿色的……
评分依据当然是根据个人的喜好,比如我对平刘海有着深刻的好感,没有平刘海简直就不是女生(逃
为了让机器知道我喜欢那些电影,以后自动帮我下载(误
我需要让机器学习一下我的癖好,就根据网站上的标签(我简称之为Tag,其实是Categories,否则打字太痛苦了)
Logistic Regression进行影片分类
原理不明的可以看这两篇:
https://zhuanlan.zhihu.com/p/20511129
https://zhuanlan.zhihu.com/p/20545718
下面是用Logistic Regression对性癖进行学习,使用了sklearn中的LogisticRegressionCV(带交叉验证的Logistic回归) 我特地没有考虑时间因子,因为实际验证的时候,因为有些片子的时间有错误,有的长达十几个小时,导致推荐的都是这些乱七八糟的影片。
短时间的视频大多数都是渣渣,但是长时间的也未必好看,我不如去掉这个因子让它不再干扰我。 虽然使用时间能达到更高的精度,但是却和“学习性癖”这个主题背道而驰了,最终的效果也并不理想。
import sklearn.linear_model regr = sklearn.linear_model.LogisticRegressionCV( Cs=60, fit_intercept=True, cv=4, dual=False, penalty='l2', scoring=None, solver='lbfgs', tol=0.0001, max_iter=1000, class_weight=None, n_jobs=1, verbose=1) regr.fit(Xt_train, y_train>-0.5) y_train_predict = regr.predict(Xt_train) y_test_predict = regr.predict(Xt_test) y_train_real = np.reshape(y_train>-0.5,y_train_predict.shape) y_test_real = np.reshape(y_test>-0.5,y_test_predict.shape) # 输出报告 from sklearn import metrics print('------------ACCURACY-------------') print "Train accuracy: %f%%" % (sum(y_train_predict==y_train_real)*100.0/len(y_train_real)) print "Test accuracy: %f%%" % (sum(y_test_predict==y_test_real)*100.0/len(y_test_real))
输出:
------------ACCURACY------------- Train accuracy: 68.211921% Test accuracy: 70.886076%
还可以,说实话,数据噪声比较大,能做到这样我已经比较欣慰了。回头用CNN带图像的时候争取做到95%+
线性的Logistic回归有很好的可解释性,让我们来看一下究竟是哪些标签让我着迷呢?
我们输出对正负分别贡献最大的N个标签:
index = np.argsort(regr.coef_[0]) tag_sorted = [] for i in index: tag_sorted.append(tag_list[i]) # 显示对分类有正贡献的词汇和负贡献的词汇 N = 20 print "Positive top N words:",","