分类目录归档:人工智能

Python 人口出生率数据预测及可视化

上次我们用多项式回归预测了天猫的2019年销售额:《Python 多项式预测2019年天猫销售额》。今天的文章同样教大家怎么进行预测,不过对象换成2019年人口出生率。

今天我们将使用多项式回归模型预测2019年的中国人口出生率。

1.准备

在中华人民共和国国家统计局官方网站上下载过去20年的人口出生率数据:http://data.stats.gov.cn/easyquery.htm?cn=C01

数据如下,我们仅取人口出生率作为我们的数据集。

2.数据预测

以下教程默认你已经安装好了Python并可以在CMD或Terminal中使用pip,如果没有请看这篇文章:安装python,同上一节预测2019年天猫销售额一样,没有太多的改变,但是我们需要找到最合适的曲线,而不是一上来就用三元回归曲线:

2.1 数据预处理

# 数据集
datasets_X = [1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018]
datasets_Y = [14.64, 14.03, 13.38, 12.86, 12.41, 12.29, 12.4, 12.09, 12.1, 12.14, 11.95, 11.9, 11.93, 12.1, 12.08, 12.37, 12.07, 12.95, 12.43, 10.94]
test_X = [2019]
 
# 数据预处理
dataset_length = len(datasets_X)
test_length = len(test_X)
# 将数据转化为numpy数组
datasets_X = np.array(datasets_X).reshape([dataset_length, 1])
test_X = np.array(test_X).reshape([test_length, 1])
datasets_Y = np.array(datasets_Y)

2.2 数据可视化

将已有的数据显示出来,并用蓝点作为标记,将每一年的横坐标都显示出来。曲线我们从二元回归曲线开始慢慢找到最符合数据趋势的曲线。

# 构造多项式特征
poly_reg = PolynomialFeatures(degree=2)
X_poly = poly_reg.fit_transform(datasets_X)
 
# 使用线性回归模型学习X_poly和datasets_Y之间的映射关系
lin_reg = LinearRegression()
lin_reg.fit(X_poly, datasets_Y)

# 数据可视化

# 蓝色显示训练数据点
plt.scatter(datasets_X, datasets_Y, color='blue')

# X轴
my_x_ticks = np.arange(1998, 2020, 1)
plt.xticks(my_x_ticks)

# 绘制线
X = np.arange(1998, 2020).reshape([-1, 1])
plt.plot(X, lin_reg.predict(poly_reg.fit_transform(X)), color='black')

plt.xlabel('Years')
plt.ylabel('Born rate')
plt.show() 

运行代码结果如下:

二元回归曲线

显然二元回归曲线并不是非常适合这些数据,有许多点分布在离直线很远的距离。让我们试试三元回归曲线,修改poly_reg变量的degree,设为3:

poly_reg = PolynomialFeatures(degree=3)

结果如下:

三元回归曲线

感觉有辣么点意思了,再试试四元回归曲线:

四元回归曲线

发现和三元回归曲线相比没有太大的变化,那我们选三元回归曲线进行预测就可以了。

2.3 数据建模

# 数据建模
# 构造三次多项式特征
poly_reg = PolynomialFeatures(degree=3)
X_poly = poly_reg.fit_transform(datasets_X)
 
# 使用线性回归模型学习X_poly和datasets_Y之间的映射关系
lin_reg_3 = LinearRegression()
lin_reg_3.fit(X_poly, datasets_Y)
 
data = poly_reg.fit_transform(test_X)
pred = lin_reg_3.predict(data)
print(pred)

预测的2019人口出生率的值为:[ 11.25692317],使用黄点表示该预测的值,得到的曲线图如下:

似乎是条挺合理的曲线,让我们拭目以待今年的人口出生率会不会是11.25,到时候记得翻出这篇文章来看看。

如果你喜欢今天的Python 教程,请持续关注Python实用宝典,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们会耐心解答的!

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 短文本自动识别个体是否有自杀倾向

上一篇文章,我们以微博树洞为例,讲解了怎么自动爬取单个微博的评论。今天我们就要用上这些数据做一个自杀倾向分类器,这样的分类器如果应用得当,将可以帮助成千上万误入歧途的人们挽回生命。

为了简化问题,我们将短文本分为两种类别中的一种,即要么是正常微博、要么是自杀倾向微博。这样,有了上次的微博树洞,训练集和测试集就非常好获得了。由于是短文本二分类问题,可以使用scikit-learn的SVM分类模型。

不过要注意的是,我们的分类器并不能保证分类出来的结果百分百正确,毕竟心理状态是很难通过文本准确识别出来的,我们只能通过文字,大致判断其抑郁情况并加以介入。实际上这是一个宁可错杀一百,不可放过一个的问题。毕竟放过一个,可能就有一条生命悄然流逝。

本文源代码: https://github.com/Ckend/suicide-detect-svm 欢迎一同改进这个项目,在训练集和模型方面,改进的空间还相当大。如果你访问不了github,请关注文章最下方公众号,回复自杀倾向检测获得本项目完整源代码。

2023-04-26更新:

提供一个5W行的数据源,数据结构请自行组合:https://pythondict.com/download/%e8%b5%b0%e9%a5%ad%e5%be%ae%e5%8d%9a%e8%af%84%e8%ae%ba%e6%95%b0%e6%8d%ae/

1.数据准备

数据集整体上分两个部分,一部分是训练集、一部分是测试集。其中,训练集和测试集中还要分为正常微博短文本和自杀倾向短文本。

将上一篇爬取微博树洞的文章中得到的数据进行人工筛选后,挑出300条作为训练集(有点少,其实业界至少也要3000条以上),再根据上次的微博爬虫随意爬取10000条微博作为训练集的正常微博类。另外再分别搜集自杀倾向微博和普通微博各50条作为测试集。

每条微博按行存储在txt文件里。训练集中,正常微博命名为normal.txt, 自杀倾向微博命名为die.txt。测试集存放在后缀为_test.txt的文件中:

此外,接下来我们会使用到一个机器学习工具包叫scikit-learn(sklearn),其打包好了许多机器学习模型和预处理的方法,方便我们构建分类器,在CMD/Terminal输入以下命令安装:

pip install -U scikit-learn

如果你还没有安装Python,请看这篇文章安装Python,然后再执行上述命令安装sklearn.

2.数据预处理

我们使用一个典型的中文自然语言预处理方法:对文本使用结巴分词后将其数字化。

由于具有自杀倾向的微博中,其实类似于”死”、”不想活”、”我走了”等这样的词语比较常见,因此我们可以用TF-IDF将字符串数字化。如果你不了解TF-IDF,请看这篇文章: 文本处理之 tf-idf 算法及其实践

数字化的部分代码如下。

print('(2) doc to var...')
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer

# CountVectorizer考虑每种词汇在该训练文本中出现的频率,得到计数矩阵
count_v0= CountVectorizer(analyzer='word',token_pattern='\w{1,}')
counts_all = count_v0.fit_transform(all_text)

count_v1= CountVectorizer(vocabulary=count_v0.vocabulary_)
counts_train = count_v1.fit_transform(train_texts) 
print("the shape of train is "+repr(counts_train.shape)  )
count_v2 = CountVectorizer(vocabulary=count_v0.vocabulary_)
counts_test = count_v2.fit_transform(test_texts)
print("the shape of test is "+repr(counts_test.shape)  )

# 保存数字化后的词典
joblib.dump(count_v0.vocabulary_, "model/die_svm_20191110_vocab.m")

counts_all = count_v2.fit_transform(all_text)
print("the shape of all is "+repr(counts_all.shape))

# 将计数矩阵转换为规格化的tf-idf格式
tfidftransformer = TfidfTransformer()  
train_data = tfidftransformer.fit(counts_train).transform(counts_train)
test_data = tfidftransformer.fit(counts_test).transform(counts_test)
all_data = tfidftransformer.fit(counts_all).transform(counts_all) 

3.训练

使用scikit-learn的SVM分类模型,我们能很快滴训练并构建出一个分类器:

print('(3) SVM...')
from sklearn.svm import SVC

# 使用线性核函数的SVM分类器,并启用概率估计(分别显示分到两个类别的概率如:[0.12983359 0.87016641])
svclf = SVC(kernel = 'linear', probability=True) 

# 开始训练
svclf.fit(x_train,y_train)
# 保存模型
joblib.dump(svclf, "model/die_svm_20191110.m")

这里我们忽略了SVM原理的讲述,SVM的原理可以参考这篇文章:支持向量机(SVM)——原理篇

4.测试

测试的时候,我们要分别计算模型对两个类别的分类精确率和召回率。scikit-learn提供了一个非常好用的函数classification_report来计算它们:

# 测试集进行测试
preds = svclf.predict(x_test)
y_preds = svclf.predict_proba(x_test)

preds = preds.tolist()
for i,pred in enumerate(preds):
    # 显示被分错的微博
    if int(pred) != int(y_test[i]):
        try:
            print(origin_eval_text[i], ':', test_texts[i], pred, y_test[i], y_preds[i])
        except Exception as e:
            print(e)

# 分别查看两个类别的准确率、召回率和F1值
print(classification_report(y_test, preds)) 

结果:

对自杀倾向微博的分类精确率为100%,但是查全率不够,它只找到了50条里的60%,也就是30条自杀倾向微博。

对于正常微博的分类,其精确率为71%,也就是说有部分正常微博被分类为自杀倾向微博,不过其查全率为100%,也就是不存在不被分类的正常微博。

这是建立在训练集还不够多的情况下的结果。我们的自杀倾向微博的数据仅仅才300条,这是远远不够的,如果能增加到3000条,相信结果会改进不少,尤其是对于自杀倾向微博的查全率有很大的帮助。预估最终该模型的精确率和召回率至少能达到95%。

本文源代码: https://github.com/Ckend/suicide-detect-svm 欢迎一同改进这个项目。如果你访问不了github,请关注文章最下方公众号,回复自杀倾向检测获得本项目完整源代码。

如果你喜欢今天的Python 教程,请持续关注Python实用宝典,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们会耐心解答的!

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 超简单实现9种图像风格迁移

图像风格迁移已经属于比较成熟的领域了,现在连实时的风格迁移都不成问题。之前一直想出一篇这样的文章,但无奈于大部分开源项目配置起来非常麻烦,比如 luanfujun/deep-photo-styletransfer 项目,需要安装 CUDA、pytorch、cudnn等等,配置完一天都过去了。

不过现在我们有了非常好的开源应用项目,那就是OpenCV的DNN图像风格迁移。你只需要安装OpenCV就可以使用了,在cmd/terminal中输入(如果你还没有安装Python,请看这篇文章:Python安装):

 pip install python-opencv

不过它也是有局限性的,我们只能用别人训练好的模型进行风格迁移,如果我们要自定义风格,那就必须配置cudn等工具,使用 deep-photo-styletransfer 等项目的方法进行训练,今天的教程我们拿fast-neural-style训练好的模型对下面的图片做一次风格迁移。

喵喵喵

1.选择模型

fast-neural-style放出的模型风格一共有9种,我们将一一尝试,其中部分风格如下比如:

candy
mosaic
starry_night
udnie

模型文件可以关注我们下方公众号 Python实用宝典,回复 风格迁移 下载,里面有全部10个模型风格的资源。

2.克隆OpenCV源码

我们直接克隆OpenCV开源项目中关于DNN图像迁移的例子,地址是:

https://github.com/opencv/opencv/blob/3.4.0/samples/dnn/fast_neural_style.py

代码如下:

import cv2 as cv
import numpy as np
import argparse

parser = argparse.ArgumentParser(
        description='This script is used to run style transfer models from '
                    'https://github.com/jcjohnson/fast-neural-style using OpenCV')
parser.add_argument('--input', help='Path to image or video. Skip to capture frames from camera')
parser.add_argument('--model', help='Path to .t7 model')
parser.add_argument('--width', default=-1, type=int, help='Resize input to specific width.')
parser.add_argument('--height', default=-1, type=int, help='Resize input to specific height.')
parser.add_argument('--median_filter', default=0, type=int, help='Kernel size of postprocessing blurring.')
args = parser.parse_args()

net = cv.dnn.readNetFromTorch(args.model)

if args.input:
    cap = cv.VideoCapture(args.input)
else:
    cap = cv.VideoCapture(0)

cv.namedWindow('Styled image', cv.WINDOW_NORMAL)
while cv.waitKey(1) < 0:
    hasFrame, frame = cap.read()
    if not hasFrame:
        cv.waitKey()
        break

    inWidth = args.width if args.width != -1 else frame.shape[1]
    inHeight = args.height if args.height != -1 else frame.shape[0]
    inp = cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight),
                              (103.939, 116.779, 123.68), swapRB=False, crop=False)

    net.setInput(inp)
    out = net.forward()

    out = out.reshape(3, out.shape[2], out.shape[3])
    out[0] += 103.939
    out[1] += 116.779
    out[2] += 123.68
    out /= 255
    out = out.transpose(1, 2, 0)

    t, _ = net.getPerfProfile()
    freq = cv.getTickFrequency() / 1000
    print(t / freq, 'ms')

    if args.median_filter:
        out = cv.medianBlur(out, args.median_filter)

    cv.imshow('Styled image', out) 

注意,源代码是基于Python2的,所以第46行少了括号,如果你是Python3请注意补上括号。

这份代码可以直接使用, parser 里定义了5个参数:

–input输入要迁移的图像位置,

–model指要使用的模型,

–width/–height指的是迁移后的图像宽度和高度,

median_filter 是中值滤波器, 基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,因此理论上数值越大,图像越平滑,输出的结果细节越好(不确定)。

median_filter 亲自试了一下,对结果的影响不大。

3.开始迁移

将上述代码保存到一个文件中,命名为1.py,在CMD/Terminal中带参数运行脚本即可迁移。如:

python 1.py --input 1.jpg --model udnie.t7

效果如下:

全部9种风格的迁移效果:

文章到此就结束啦,如果你喜欢今天的Python 教程,请持续关注Python实用宝典,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 超简单实现人类面部情绪的识别

还记得我们之前写过一篇文章《手把手教你人脸识别自动开机》吗?里面用OpenCV对人脸进行简单的识别,让计算机训练认识到某个特定人物后识别对象。今天来做点高级的,识别出人脸的情绪

本文分为两大部分:

1.面部检测:检测图像的脸部位置,输出边界框的坐标

2.情绪检测:将面部的情绪分为高兴、生气、悲伤、中性、惊讶、厌恶、恐惧。

一、面部检测

可以使用上次文章( 《手把手教你人脸识别自动开机》 )中讲到的方法—用openCV检测,也可以使用face_recognition项目非常简单地实现面部检测。

这里我们尝试一下face_recognition项目, face_recognition 安装:

Face_recognition需要用到一个包叫dlib, 通过pip可能不一定装得上,因此这里推荐大家使用anaconda安装dlib:

conda install -c conda-forge dlib 

然后再安装Face_recognition:

pip install face_recognition

用face_recognition三句代码就能识别图像中的脸部:

import face_recognition
image = face_recognition.load_image_file("1.png")
face_locations = face_recognition.face_locations(image)

二、情绪检测

人类习惯从面部表情中吸收非言语暗示,那么计算机可以吗?答案是肯定的,但是需要训练它学会识别情绪。今天我们不太可能讲收集数据、构建CNN模型等逻辑流程。我们直接用priya-dwivedi训练好的模型,他们用Kaggle开源数据集(人脸情感识别 FER)训练了一个六层卷积神经网络模型。

现在就调用模型识别一下孙哥在这张图里的情绪吧:

import face_recognition
import numpy as np
import cv2
from keras.models import load_model
emotion_dict= {'生气': 0, '悲伤': 5, '中性': 4, '厌恶': 1, '惊讶': 6, '恐惧': 2, '高兴': 3}

image = face_recognition.load_image_file("1.png")
# 载入图像
face_locations = face_recognition.face_locations(image)
# 寻找脸部
top, right, bottom, left = face_locations[0]
# 将脸部框起来

face_image = image[top:bottom, left:right]
face_image = cv2.resize(face_image, (48,48))
face_image = cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY)
face_image = np.reshape(face_image, [1, face_image.shape[0], face_image.shape[1], 1])
# 调整到可以进入该模型输入的大小

model = load_model("./model_v6_23.hdf5")
# 载入模型

predicted_class = np.argmax(model.predict(face_image))
# 分类情绪
label_map = dict((v,k) for k,v in emotion_dict.items()) 
predicted_label = label_map[predicted_class]
# 根据情绪映射表输出情绪
print(predicted_label)

结果:

python emotion.py
高兴

从下面终端输出的结果我们可以看到孙哥现在是高兴的情绪,这个结果应该正确(毕竟孙哥还是表里如一的)。

虽然简单,但还是建议有兴趣的同学从头到尾做一遍试一下,过程中会遇到不少的坑,慢慢百度谷歌解决就好了。

文章到此就结束啦,如果你喜欢今天的Python 教程,请持续关注Python实用宝典,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 优秀开源项目推荐—实时语音克隆等 (2019年8月)

1. 实时语音克隆: 非常流弊的项目,能在5秒钟内克隆对象的语音实时生成任意文本语音,而且生成的语音非常非常像!By Corentin Jemine.

实时语音克隆

2. 婴儿名字分析:将数据集“社会保障卡应用程序的婴儿名字”的数据进行抽取、转换、加载和分析。

婴儿名字分析

3.Pyrobot:PyRobot 开源机器人研究平台。PyRobot是一个轻量级的Python高级接口,为机器人操作和导航提供api。该开源还包含了LoCoBot的底层堆栈,LoCoBot是一种低成本的移动机械手硬件平台。

PyRobot

4.苹果嗅探器 Apple_bleee:一个可以知道苹果手机当前状态的蓝牙嗅探器,如是否开了WIFI、当前界面是否在桌面、是否正在拨通电话、是否正在锁屏状态等等。

蓝牙嗅探器

5.Gryphon:强大,可靠且可扩展的开源软件框架, 用于构建和运行加密货币市场中的算法交易策略,可以任何频率建立交易策略。

Gryphon

文章到此就结束啦,如果你喜欢今天的Python 教程,请持续关注Python实用宝典,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python使用”先知”预测公众号未来的粉丝量

最近公众号的粉丝量一直都处于上涨状态,可喜可贺当然,作为一个上进的(摸鱼)公众号博主,当然要追求更远大的目标。我希望知道一个月后公众号的粉丝量会达到什么程度,并以此加强公众号的宣传方式。

正好,Facebook开源了一个名为“先知”(prophet)的模型,其能基于加法模型预测时间序列数据,它的非线性趋势与年、周、日的季节性以及假日效应相吻合。而且对丢失的数据和趋势的变化很健壮,通常能很好地处理异常值。

我们将根据 Python 实用宝典 最近60天的关注量变化趋势用来预测未来30天的关注量大小。

1. 安装fbprophet

现在,就让我们来试一下吧!首先是安装fbprophet, 这里的前提是大家都安装好了Python, 如果没有的话推荐看:python超详细安装指南,如果你按照官方的教程来进行安装, 你会发现TM啥也安装不上

第一步,我们需要安装fbprophet的依赖PyStan:

pip install pystan

第二步,使用conda命令安装(需要安装anaconda, 搜anaconda官网安装即可):

conda install -c conda-forge fbprophet
pip install fbprophet

2.导出公众号数据

这时候就要用F12大法了,在当前用户分析页空白处右键—检查,或者直接按F12打开开发者工具

然后选择最近两个月的数据,找到useranalysis的数据包,点开来就会找到我们需要的数据,把这一片json数据保存下来存为data.json文件即可,如下图所示。

3.处理数据

加载json数据:

import json

f = open('./data.json', 'r', encoding='utf-8')
json_data = json.load(f)
f.close()

print(json_data)

现在需要将日期和其对应的总粉丝数提取出来为一个pandas的dataframe. 如果你还没有安装 pandas,请在cmd/Terminal输入 pip install pandas 即可安装成功。

import pandas as pd
# 将日期和其对应的总粉丝数提取出来为一个pandas的dataframe
list_number = json_data['category_list'][0]['list']
df = pd.DataFrame(list_number)
print(df)

效果:

看得出来dataframe有点像字典和列表的集合,接下来就要开始进行预测了!

4.预测未来30天的数据

接下来需要生成prophet对象,调用预测函数,预测未来30天的数据变化:

from fbprophet import Prophet

# prophet内部需要将日期列设为ds,预测的值设为y
df.rename(columns={'date':'ds', 'cumulate_user':'y'}, inplace=True)

print(df)

# 调用"先知"生成对象
m = Prophet()

# 使用"先知对象"进行预测
m.fit(df)

# 获得未来30天的数据
future = m.make_future_dataframe(periods=30)

forecast = m.predict(future)
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())  

效果如下:

让我们来看看效果,表格中的yhat指的是预测的平均值,yhat_lower是预测的最小值,yhat_upper是预测的最大值。根据“先知”的预测,在未来30天内我们的粉丝量将会增加到529名粉丝,也就是说将增加16%。这个预测的值其实相对客观,我们一个月后就可以看看效果如何了。

关注下方的公众号,回复 ” 粉丝预测“即可获得全部源代码及数据。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

为什么Python这么适合AI和机器学习?4位专家给你答案

Python是机器学习的最佳编程语言之一,其迅速地在学术界和相关研究领域威胁到甚至超过了R的主导地位。为什么Python在机器学习领域如此受欢迎呢?为什么Python对AI有好处?

Mike Driscoll采访了4位Python专家和机器学习社区人士,讨论了Python在AI和相关研究领域中如此受欢迎的原因。

编程是一种社会活动——Python的社区已经透彻认识到了这一点

Glyph Lefkowitz

Glyph Lefkowitz (@glyph)是Python网络编程框架Twisted(一个能用于Python异步开发的)的创始人,他在2017年获得了PSF的社区服务奖。他是这么认为的:

人工智能是一个包罗万象的术语,它倾向于指当前计算机科学研究中最先进的领域。

曾经有一段时间,我们理所当然的以为基本图形遍历被认为是AI。在那个时候,Lisp是一种大型人工智能语言,因为它比一般的编程语言要高级,而且研究人员可以更容易地用Lisp做快速原型。我认为Python在总体上已经很大程度上取代了它,因为除了具有类似的高级功能外,它还有一个优秀的第三方生态系统。

Lispers会反对,所以我应该说清楚,我并不是要捧高Python的地位,只是说Python和Lisp都是同一类语言,比如在垃圾回收、内存安全等机制、命名空间和高级数据结构等方面都具有相似的特点。

从机器学习的更具体的意义上说,也就是现在越来越多的人所说的人工智能,我认为有更具体的答案。NumPy的存在及其伴随的生态系统允许非常适合研究的高级内容的混合,以及非常高性能的数字处理。如果不是非常密集的数字运算,机器学习就什么都不是。

“……统计学家、天文学家、生物学家和业务分析师都已经成为Python程序员,并改进了这个语言。”

Python社区致力于为非程序员提供友好的介绍和生态系统支持,这确实增加了它在数据科学和科学计算的姊妹学科中的应用。无数的统计学家、天文学家、生物学家和业务分析师已经成为Python程序员,并改进了这个语言。编程本质上是一种社会活动,Python社区比除JavaScript之外的任何语言都更认可这一点。

Python让用户关注真正的问题

Marc-Andre Lemburg

Marc-Andre Lemburg (@malemburg),PSF的联合创始人和eGenix的首席执行官。他是这样认为的:

Python对于没有受过计算机科学训练的人来说非常容易理解。当您试图执行研究所需的外部时,它消除了您必须处理的许多复杂性。

在Numeric(现在是NumPy)开始开发之后,新增了IPython笔记本(现在是Jupyter笔记本)、matplotlib和许多其他工具,使事情变得更加直观,Python允许使用者主要考虑问题的解决方案,而不是驱动这些解决方案所需的技术。

“Python是一种理想的集成语言,可以轻松地将技术绑定在一起。”

Python是一种理想的集成语言,可以轻松地将技术绑定在一起。Python允许用户关注真正的问题,而不是将时间花在实现细节上。除了让用户更容易操作之外,对于开发外部的底层集成人员来说,Python还是一个理想的粘合平台。这主要是因为Python非常容易通过一个漂亮而完整的C语言API访问。

Python有许多适合科学计算的特性

Luciano Ramalho

Luciano Ramalho (@ramalhoorg), ThoughtWorks技术负责人,PSF研究员。他是这么看的:

最重要和最直接的原因是NumPy和SciPy支持像scikit-learn这样的项目,scikit-learn目前几乎是机器学习的标准工具

首先创建NumPy、SciPy、scikit-learn和许多其他的原因是Python具有一些特性,使其对科学计算非常方便。Python有一个简单且一致的语法,这使得非软件工程师更容易进行编程。

“Python得益于科学计算的丰富生态系统。”

另一个原因是运算符重载,这使得代码可读且简洁。然后是Python的buffer protocol (PEP 3118),它是外部在处理类似数组的数据结构时与Python有效互操作的标准。最后,Python得益于科学计算的丰富生态系统,这吸引了更多的科学家与开发者,并创造了一个良性循环。

Python严格一致的特点使其对AI非常友好

Mike Bayer

Mike Bayer (@zzzeek), Red Hat高级软件工程师,SQLAlchemy的创建者。他是这么认为的:

我们在这个领域所做的是开发我们的数学模型和算法。我们正在把我们肯定想要保留的和优化的算法放入像scikit-learn这样的中。然后,我们将继续迭代并共享关于如何组织和考虑数据的注释。

高级脚本语言是人工智能和机器学习的理想语言,因为我们可以快速转移数据,然后再试一次。我们创建的代码的大部分用于表示实际的数学和数据结构。

像Python这样的脚本语言甚至更好,因为它是严格和一致的。每个人都可以更好地理解彼此的Python代码,而不是使用其他具有混乱和不一致编程范例的语言。

Python重视我们正在努力做的工作的核心,并且完全最小化了我们如何给计算机下达指令等其他事情,这是应该的,自动化所有你不应该考虑的事情,让你更好地为了达到目标写代码。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

准确率94%!Python 机器学习识别微博或推特机器人

推特或微博机器人的存在其实是比较危险的,他们可以制造虚假的流量、传播谣言、甚至执行一些令人汗颜的恶意操作,这里我们使用kaggle纽约大学2017年机器学习竞赛的推特分类数据来进行我们的识别实验,本实验的数据集请访问:下载Python推特机器人分类数据集

在开始之前我们需要安装以下Python包(),打开你的CMD(Windows系统)/Terminal(macOS系统)输入以下指令即可:

pip install numpy
pip install seaborn
pip install pandas
pip install matplotlib
pip install scikit-learn

其中numpy和pandas都是用于数据处理的,numpy是一个C编写的,所以运算会比python内置的运算快,此外,matplotlib和seaborn主要用于Python数据可视化。scikit-learn内置了许多常用的机器学习分析模型,用起来非常简单。

1.Python加载数据

好了,废话不多说,让我们现在就开始使用panda加载数据,分别获得bot和非bot数据:

import pandas as pd
import numpy as np
import seaborn
import matplotlib

data = pd.read_csv('training_data.csv')
Bots = data[data.bot==1]
NonBots = data[data.bot==0]

使用热力图识别训练集/测试集中缺失数据:

seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
# 热力图,当data中有空值时标为黄色
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()
Python识别缺失数据

2.Python 特征选择

什么是特征选择?其实很简单,我们在日常生活中识别西瓜和榴莲的时候是怎么识别的?比如从外观特征上:榴莲带刺、黄色的;西瓜圆润、绿色的。机器学习模型也是一样的,我们需要从类似于挑选西瓜外观特征来挑选两个类别的特征。比如说应用上我们前面的Python热力图查看数据缺失

Python机器人的数据缺失热力图
Python非机器人的数据缺失热力图

我们可以明显地看到机器人的location, urls明显缺失的部分更多。因此我们的特征可以加上这两项,由于数据量不多,我们应该绕过字符串编码,以location列为例,编码方式为:如果location缺失则为false, location存在则为True.

其他特征当然还有比如姓名、描述(description ) 这样的必输信息。当然,我们还能通过选择Twitter机器人使用的一些不好的单词将他们作为特征,如果他们的信息里包含了这些脏话,则将该机器人的该项特征设为True。下面是一个机器人使用脏话的例子。你可以添加更多的单词:

bag_of_words_bot = r'bot|b0t|cannabis|tweet me|mishear|follow me|updates every|gorilla|yes_ofc|forget' \
r'expos|kill|bbb|truthe|fake|anony|free|virus|funky|RNA|jargon'\
r'nerd|swag|jack|chick|prison|paper|pokem|xx|freak|ffd|dunia|clone|genie|bbb' \
r'ffd|onlyman|emoji|joke|troll|droop|free|every|wow|cheese|yeah|bio|magic|wizard|face'

将我们的特征编码为数字的形式:

# 该列的每个值包不包含脏话,包含则为True,不包含则为False
data['screen_name_binary'] = data.screen_name.str.contains(bag_of_words_bot, case=False, na=False)
data['name_binary'] = data.name.str.contains(bag_of_words_bot, case=False, na=False)
data['description_binary'] = data.description.str.contains(bag_of_words_bot, case=False, na=False)
data['status_binary'] = data.status.str.contains(bag_of_words_bot, case=False, na=False)

# 判断该列的每个值是否有listedcount>20000的情况,有的话为False,没有的话为True
data['listed_count_binary'] = (data.listedcount>20000)==False 

# 判断该列的每个值是否有空的情况,有空的则为False,否则为True
data['location_binary'] = ~data.location.isnull()
data['url_binary'] = ~data.url.isnull()

# 选定我们的特征
features = ['screen_name_binary', 'name_binary', 'description_binary', 'status_binary', 'verified', 'followers_count','verified', 'friends_count', 'statuses_count', 'listed_count_binary', 'bot', 'url_binary', 'location_binary', 'default_profile', 'default_profile_image'] 

其中需要注意的是所有的文本我们都编码为0和1的形式(存不存在脏话)。

3.Python scikit-learn训练与测试

现在让我们来使用Python scikit-learn包里的决策树模型进行分类。

首先我们引入需要使用到的包,有三个,如下:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split 

1.从 sklearn.tree 引入 DecisionTreeClassifier ,这是一个决策树的分类器模型,我们一会将使用它进行训练;
2.sklearn.metrics 引入 accuracy_score 这是用于方便计算准确率的;
3.sklearn.model_selection 的 train_test_split 是用于方便分割训练集和测试集的。

分割训练集

X = data[features].iloc[:,:-1] 
# 除了最后一列的BOT都是数据
y = data[features].iloc[:,-1] 
# BOT是分类对象,1:机器人 0:非机器人X_train, 
X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)

使用到了train_test_split()函数,test_size=0.3即30%的数据用于测试,random_state=101 是随机数种子,设置后对于每次不改变训练集的测试,测试结果都一样。

训练与测试

clf = DecisionTreeClassifier(criterion='entropy', min_samples_leaf=50, min_samples_split=10)
clf.fit(X_train, y_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)  
print("Training Accuracy: %.5f" %accuracy_score(y_train, y_pred_train))
print("Test Accuracy: %.5f" %accuracy_score(y_test, y_pred_test)) 

初始化了一个决策树模型clf,clf.fit即开始进行训练,clf.predict则为测试。

4.Python 模型结果

测试结果

最终我得到的结果如下,测试准确率高达94.4%,这是一个相当令人满意的结果了,在当时的kaggle比赛里大约能排在27名左右。你也可以尝试其他的模型,并非只有决策树可以选择,比如说SVM、LR都可以尝试一下。

kaggle排名

全部源代码下载请点击:Python机器学习识别微博或推特机器人(acc:94.4%)

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

python 树莓派人脸识别自动开机教程

是不是厌烦了每次回家都要点击按钮打开电脑的操作?

你如果有看过我以前的推送,是不是厌烦了每次回家都要喊“echo,turn on my pc”,让智能音箱打开电脑的操作?

现在,我们有一个全新的操作,坐到椅子上就能让电脑开机!

(避免你跟我一样,拥有一口蹩脚的英语,让echo听不懂的尴尬)

本教程所需要的工具及应用:

  1. 1.一个树莓派3
  2. 2.一个可在树莓派3上运行的摄像头(我用的是罗技C270,树莓派官方摄像头也可以)
  3. 3.Python3
  4. 4.路由器一台,及支持WakeOnLan的主机(大部分都支持)

如果你只是想在windows/macos上尝试一下人脸识别而不需要进行自动开机,则需要:

1.Python3
2.一个可运行的摄像头

自动开机效果演示:

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2019/08/2019082703565322.mp4

1. 安装必要的python组件

windows/macOS:

pip install opencv-python

非常简单,和树莓派的安装复杂度不是一个级别的。

树莓派

树莓派上的安装过程比较复杂,需要耐心折腾,分为以下步骤:

1.1 安装Cmake等编译openCV源码的工具
sudo apt-get install build-essential cmake pkg-config
1.2 安装几种常见格式的图像操作的包
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
1.3 安装视频操作的包
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev  
sudo apt-get install libxvidcore-dev libx264-dev
1.4 openCV用于图像/GUI展示的功能依赖highgui模块,为了编译它我们需要安装libgtk2.0-dev
sudo apt-get install libgtk2.0-dev
1.5 额外依赖
sudo apt-get install libatlas-base-dev gfortran
1.6 当然,还要安装构建Python扩展所需要的头文件
sudo apt-get install python2.7-dev python3-dev
1.7 下载并编译opencv和opencv_contrib的源码

下载并解压:

cd ~
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.0.zip
unzip opencv.zip 
wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/4.1.0.zip
unzip opencv_contrib.zip

编译:

cd ~/opencv-4.1.0/
mkdir build & cd build 
cmake -D ENABLE_PRECOMPILED_HEADERS=OFF \ -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.1.0/modules \ -D BUILD_EXAMPLES=ON ..
make -j4 
make install 
make ldconfig

PS:请注意你自己放置的目录和版本的区别,make -j4 是四线程进行编译,过程大约需要2-3个小时,如果说j4编译失败,请去掉-j4这个参数,直接make (单线程,这样大约需要6-9个小时).

2. 测试你的摄像头

编写如下的Python文件,test.py:

运行本程序:

python test.py

如果成功,你将会看到你的摄像头灯亮起(如果有灯的话),屏幕出现两个窗口,一个是彩色的,一个是灰色的。

你还可以在读取到frame后对frame进行操作,如

frame = cv2.flip(frame, -1) # 垂直反转摄像头图形

对摄像头进行垂直翻转。

2. 人脸识别

人脸识别模块我们将使用Haar级联分类器,我们自己搜集人脸图片然后进行训练是比较麻烦的,好在openCV已经提供了相关的人脸识别XML文件,使用这些文件我们就能直接进行人脸或笑脸的识别,下载地址:

https://github.com/opencv/opencv/tree/master/data/haarcascades

我们代码需要用到里面的 haarcascade_frontalface_default.xml ,当然,如果你想尝试别的识别也可以进行下载。

编写如下的Python文件,test2.py:

运行本程序:

python test2.py

如果成功,当有人脸出现在摄像头范围内,则会被用蓝色框框画起来。如图所示:

3. 获取你的人脸数据作为训练集

好了,我们刚刚成功识别了人脸,现在我们需要识别出某个人脸是某个人,比如当我出现在镜头中,它要识别出这个人就是“幻象客”。

新建文件夹train_data,用于保存拍摄下来的人脸,一共拍摄五十张人脸图片,get_train_data.py:

4. 训练刚刚得到的数据

拍摄完我们的图像后,我们还需要对这些图片进行训练,train.py:

训练完成后,当前文件夹会出现trainer.yml文件,这就是我们所需要的模型文件。

5.实体对象并通知设备自动开机

现在我们就可以使用刚刚训练出来的模型文件,对人脸进行检测,以识别出该人脸的实体对象。

recognize.py 代码如下:
如果你只是在windows或者macOS上运行,直接把wake_on_lan函数调用去掉即可。

其中,在标记人脸部分,由于我们的训练集数量少,我把识别到的人脸然后开机的阈值调到了40,避免无法自动开机的尴尬之处,当识别到的人脸的信度大于40,这个人脸对应的名字是我的时候,才会进行开机操作。

这么低的信度也不需要担心识别到别人的脸也开机,经过测试,陌生人的脸大约只有10~20的信度。当然,如果你还是担心,可以把训练集增加,然后调高该判断的信度阈值。

wake_on_lan()函数中的参数,是你需要自动开机的电脑的mac地址。wake on lan 简称WOL,它能让你使用路由器通过LAN端口对某个设备进行开机的操作。本推送中的自动开机使用到的功能就是这个。你需要在路由器的管理页面中,看到本机的mac地址,并送入这个函数中。

树莓派上运行这个Python文件,将脸凑到摄像机前,就会将mac地址对应的设备开机(当然,这个设备要连着路由器才行)。

===========================================

思考一下,其实当训练集够多的时候,准度是相当高的,如果你的照片已经保存在某些数据中,比如尝试过人脸识别通过火车站。那么通过监控摄像头获取你每天的日常路线将轻而易举。这是一件比较可怕的事,我们需要认真思考新时代的人脸识别技术的应用范围了

欢迎查看本系列的其他教程:

系列教程一, 本文章用到了该文章中提到的wake on lan.

1. 利用智能音箱语音控制电脑开关机

系列教程二

2. 语音控制 – 改造普通风扇

系列教程三

3. 语音控制 – 改造普通台灯

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

[准确率:98%] Python 改进朴素贝叶斯自动分类食品安全新闻 实战教程

模型成品在极致安食网:https://jizhianshi.com, 木有太多时间维护。

这是本系列第二篇文章,位于源代码的 2. NB_Weights 中:

https://github.com/Ckend/NLP_DeepLearning_CN_Tutorial

前一篇文章中,我们学习了如何使用朴素贝叶斯自动分类食品安全新闻,准确率为97%,这一篇文章将教大家如何改进这个模型。阅读本篇文章之前,建议先阅读前一篇文章:[准确率:97%] 朴素贝叶斯自动分类食品安全新闻,否则有些概念可能无法理解。

在那篇文章中,在训练的时候,朴素贝叶斯模型中所有词语都是相同的权重,而事实上真的如此吗?我们怎么样才可以知道哪些词语更加重要呢?这时候,数理统计就派上用场了。

我们先对所有的食品安全新闻和非食品安全新闻使用结巴(jieba)分词, 然后统计各个词性在这分别在这两个类别中的数量,比如说名词的结果如下表(使用SPSS得到,其他词性就不一一展示了),显然食品安全新闻中名词的数量多于非食品安全新闻,这也是在人意料之中的结果,但是这并不代表着对于食品安全新闻,名词的重要性就大于其他的词性:

那么如何确定各个词性对分类的重要性呢?单纯根据频率和频数确定是比较复杂的,我们可以尝试使用我们的模型,比如说,先得到一个基准的准确值,然后尝试去除掉名词得到一个准确值,观察这两个准确值的差距,如果非常大,说明名词具有比较重要的地位。我们可以试一下:

在所有词性权重都为1的情况下(基准)进行训练,准确率为:

如果说,名词权重为0呢?

不过,没有对比是没有意义的,我们尝试令形容词权重为0,看看怎么样:

可以看到几乎没有影响,也就是说,对于我们的分类器而言,名词的重要性远远大于形容词。这样,我们可以尝试增加名词的权重,看看效果怎么样:

准确率 0.98,效果显著,不过我们很难确定最佳的权重,只能通过(玄学)调参来找到最合适的权重,你也可以尝试用神经网络来确定权重,虽然容易过拟合,但也是一种方法。不过既然用上了神经网络,就有更优秀的模型可以使用了,我们下次再介绍吧。

接下来讲一下这个权重的实现原理(要是不耐烦,可以直接看文章首行的源代码):基于前一篇文章,我们修改jieba_cut_and_save_file这个函数,这个函数在训练的时候用到了,它修改的就是训练时每个新闻被向量化而成的值,如下所示:

将该函数改成这样:

def jieba_cut_and_save_file(inputList, n_weight, a_weight, output_cleaned_file=False):

   """
   1. 读取中文文件并分词句子
   2. 可以将分词后的结果保存到文件
   """

    output_file = os.path.join('./data/', 'cleaned_' + 'trainMatrix.txt')
    lines = []
    tags = []

    for line in inputList:
        result = pseg.cut(clean_str(line))
        a = []
        b = []
        for word, flag in result:
            # 对分词后的新闻
            if word != ' ':
                # 若非空
                a.append(word)
                if flag.find('n')==0:
                    # 若是名词
                    b.append(n_weight)

                elif flag.find('a')==0:
                    # 若形容词
                    b.append(a_weight)
                else:
                    b.append(1)

        lines.append(a)
        tags.append(b)

    if output_cleaned_file:
        with open(output_file, 'w') as f:
            for line in lines:
                f.write(" ".join(line) + '\n')

    vocabulary = createVocabList(lines)

    # 根据词典生成词向量化器,并进行词向量化
    setOfWords2Vec = setOfWords2VecFactory(vocabulary)
    vectorized = []
    for i,news in enumerate(lines):
        vector = setOfWords2Vec(news, tags[i])
        vectorized.append(vector)

    return vectorized, vocabulary

最后,在主函数调用的时候传入你想需要的参数即可,你可以按照代码,修改任意词性权重,不过要注意结巴的词性表(每种词性的字母),你可以搜索“ictclas 词性表”得到。

import bayes
from data_helpers import *
from sklearn.externals import joblib


posFile = "./data/train_food.txt"
negFile = "./data/train_notfood.txt"



print("正在获取训练矩阵及其分类向量")
trainList,classVec = loadTrainDataset(posFile,negFile)

print("正在将训练矩阵分词,并生成词表")
n_weight = 3
# 名词权重
a_weight = 1
# 形容词权重

vectorized, vocabulary = jieba_cut_and_save_file(trainList, n_weight, a_weight, True)
bayes_ = bayes.oldNB(vocabulary)

# 初始化模型
print("正在训练模型")
bayes_.train(vectorized, classVec)

# 训练
print("保存模型")

joblib.dump(bayes_, "./arguments/train_model.m")

最后总结一下,我们通过修改训练集新闻中不同词性的权重,加大名词权重,从而提高朴素贝叶斯模型的准确率到98%,不过,这个仅仅是在食品安全新闻这个例子中是这样,你如果想要应用到自己的程序上,应该先找到你的关键词性。下一篇文章我们将尝试一些新的模型元素。如果你喜欢的话,请继续关注幻象客。