上次我们用多项式回归预测了天猫的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实用宝典
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。