很污的机器学习:从xhamster网站找到喜欢的片子
前言
最近迷上了看黄片(大雾)。每次总是去搜索想看的片子,什么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。
原始数据的采集
首先是原始数据的收集,我随机收集了大约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:",",".join(tag_sorted[-N:])
print "Negative top N words:",",".join(tag_sorted[:N])
输出:
Positive top N words: Fucking,Porno Vrai,Blowjobs,German,Shaved,French,Young Masturbating,Masturbating,Chubby,Sexy Latina,Fisting and Squirting,Teens,Gangbang,Pussy Fucking,Muscular Women,Double Penetration,Hardcore,Creampie,Japanese,Anal
Negative top N words: Amateur,Close-ups,Throat Fuck,Big Dick,Bisexuals,Sexy Horny,Flashing,Outdoor,Hidden Cams,Public Nudity,Redheads,Wife,Sofia Gucci,Anal Fuck,Granny,Cock Suckers,Student,Oral,Mexican,Private
(好吧我觉得我暴露了)
Logistic模型实战用于影片推荐
虽然后来又试了SVR或者Lasso等回归方法来推荐,但是最后还是选择了Logistic回归为我的影片进行打分。
下面是用训练好的Logistic模型为我爬虫爬到的所有电影打分,并且我使用了一个django网站来显示这些影片的预览,来看看和我的喜好是否相符合。
我可以对推荐的视频进行打分,打分多了以后可以重新学习,提高系统精度。
我们来看一下机器给我的30W个视频打分的分布:(0最低,1最高)
我们可以看到,高于0.5分(分类界)的视频少之又少,说明这个网站整体质量欠佳(至少对我而言),但是不乏也有一些金矿可以开发。
附录:评分的分布
可以看到我打分是偏低的,并不是说我是一个严格的评分者,而是网站并不很对我胃口。
最后我以-0.5为分界线作为正样本和负样本的标签依据。
附录:播放时间的统计分析
数据下载到本地的数据库以后(本文使用的是PostgreSQL数据库)随后我对这30万个数据进行了初步的分析:
首先查看播放时间的分布:
[F,x,p]=hist(Tall,bins=35)
xlabel('Time(s)')
ylabel('Frequency')
我们发现聚集在0附近的比较多,而且播放时间都是大于0的(这算常识了) 我们再统计一下log(T)的分布:
[F,x,p]=hist(np.log10(Tall),bins=50,normed=True,histtype='stepfilled',alpha=0.35)
xlabel('log_10(Time(s))')
ylabel('Frequency')
可以看到现在的分布比较好看了,也具有更“好”的性质了(其实就是长的像正态,至于是不是正态应该qqplot一下)
import pylab
import scipy.stats as stats
stats.probplot(np.log10(Tall).reshape((len(Tall),)), dist="norm", plot=pylab)
pylab.show()
可以看到,还是基本符合正态分布的。但是最后的分析并没有用到时间,原因有说明。
附录:彩蛋一枚,请唱出来
Logistic, 带带我,我要上火车啊
Logistic, 带带我,我要看小片啊
Logistic不是那种“人”,那种事情不可能
阿哩哩,阿哩哩,阿哩阿哩哩
Logistic, 带带我,并行性能高啊
Logistic, 带带我,鲁棒性能好啊
管你分类不分类,噪声太大先清洗
阿哩哩,阿哩哩,阿哩阿哩哩
Logistic, 带带我,我的数据多啊
Logistic, 带带我,可解释性好啊
梯度上升要并发,送入模型快训练
阿哩哩,阿哩哩,阿哩阿哩哩
很污的机器学习:从xhamster网站找到喜欢的片子的更多相关文章
- 如何从ST网站找到对应的固件库
ST官方网站改版后,基本上很难搜索到固件库的地址,找了半天才找到固件库的下载地址,通过此方法可以找到其他需要的资源,故记下来方便大家. 下载的网站地址为: Home>Tools and Soft ...
- STM32 ~ 如何从ST网站找到对应的固件库
ST官方网站改版后,基本上很难搜索到固件库的地址,找了半天才找到固件库的下载地址,通过此方法可以找到其他需要的资源,故记下来方便大家. 下载的网站地址为: Home>Tools and Soft ...
- iOS之学习资源收集--很好的IOS技术学习网站
点击图片也能打开相关的网站: https://boxueio.com/skill/swift http://ios.b2mp.cn/ http://gold.xitu.io/welcome/?utm_ ...
- 检测SSL证书很好用的三个网站
https://cryptoreport.websecurity.symantec.com/checker/views/certCheck.jsp https://cipherli.st/ https ...
- 大型网站都喜欢把js写在html中的真正原因
相信经常观察大站的朋友都会发现,他们都把CSS写在HTML页面里,一个页面的或者多个页面的背景图片,都集成到一张图片里,他们有的JS文件,也写到页面里了……也许你会迷惑,现在到处讲页面的优化,不都是要 ...
- RS chap1:好的推荐系统
一.什么是推荐系统 1.个性化推荐系统:从庞大的电影库中找几部符合你兴趣的电影供你选择. 2.推荐系统是帮助用户快速发现有用信息的工具.和搜索引擎不同的是,推荐系统不需要用户提供明确的需求,而是通过分 ...
- 00-01.PHP 网站假设win7配置自己的IIS服务器亲自做的图文很详细 [转 - 赞 ]
win7配置自己的IIS服务器亲自做的图文很详细 分步阅读 跟人网站爱好初学者必看的win7系统配置自己的IIS,可以在你自己的电脑上配置网站服务器发不到网上,下面就跟着我的步骤一起做吧100%成功. ...
- 【机器学习Machine Learning】资料大全
昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...
- 【转】自学成才秘籍!机器学习&深度学习经典资料汇总
小编都深深的震惊了,到底是谁那么好整理了那么多干货性的书籍.小编对此人表示崇高的敬意,小编不是文章的生产者,只是文章的搬运工. <Brief History of Machine Learn ...
随机推荐
- 分析NGINX 健康检查和负载均衡机制
nginx 是优秀的反向代理服务器,这里主要讲它的健康检查和负载均衡机制,以及这种机制带来的问题.所谓健康检查,就是当后端出现问题(具体什么叫出现问题,依赖于具体实现,各个实现定义不一样),不再往这个 ...
- ADXL345经验总结,采用SPI和I2C总线操作
一. ADXL345简介 ADXL345是ADI公司推出的三轴(x,y,z)iMEMS数字加速度计(digital accelerometer),具有在16G下高分辨率(13Bit)测量能 ...
- maven常用命令介绍(持续更新)
一.Maven的基本概念 主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1.项目构建 项目构建过程包括[清理项目]→[编译项目]→[测试项目]→[生成测试报告]→[打包项目]→[ ...
- LoadRunner 调用Dll完成加密解密
LoadRunner里的函数比较少,没有MD5.Base64加密. 我们可以通过在C++里把一些加解密写成函数,供LR调用. DLL函数编写 C++里新建工程Class Library(此处是用VS2 ...
- Git合并分支命令:git merge --ff
今天研究了一下git merge命令常用参数,并分别用简单的例子实验了一下,整理如下: 输入git merge -h可以查看相关参数: --ff 快速合并,这个是默认的参数.如果合并过程出现冲突,G ...
- bzoj1492--斜率优化DP+cdq分治
显然在某一天要么花完所有钱,要么不花钱. 所以首先想到O(n^2)DP: f[i]=max{f[i-1],(f[j]*r[j]*a[i]+f[j]*b[i])/(a[j]*r[j]+b[j])},j& ...
- C++模板杂谈
在模板编程中,有几个常用的技术:模板(偏)特化,特性萃取,标签分派,匹配失败不是错误.其中模板(偏)特化是基础,匹配失败不是错误(SFINAE)应用最为广泛. 现代C++对模板编程做了更多的加强,bo ...
- 简述public private protected internal修饰符的访问权限
public 关键字是类型和类型成员的访问修饰符.公共访问是允许的最高访问级别.对访问公共成员没有限制. protected 关键字是一个成员访问修饰符.受保护成员在它的类中可访问并且可由派生类访问. ...
- Java丨博客系统
后台界面: 前台界面: 这是一个由我带着刚入门的几位实习生做的一个博客系统,希望给java入门的学习者一个例子,这个系统还需要完善,主体功能是实现了,还差一些细节,如果需要源码的话可以在下方给我留言! ...
- Debug和Release区别
VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...