Stata-Python交互-7:在Stata中实现机器学习-支持向量机

发布时间:2021-02-22 阅读 265

Stata连享会   主页 || 视频 || 推文 || 知乎

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh

课程详情 https://gitee.com/arlionn/Course   |   lianxh.cn

课程主页 https://gitee.com/arlionn/Course

作者:吕卓阳(厦门大学)
E-Maillvzy20@163.com

致谢: 本文摘自以下文章,特此感谢!
Source: Chuck Huber, 2020, Stata/Python integration part 7: Machine learning with support vector machines, -Link-

Stata/Python 交互系列推文 源自 Stata 公司的统计项目总监 Chuck Huber 博士发表于 Stata 官网的系列博文,一共 9 篇。较为系统地介绍了 Stata 与 Python 的交互方式,包括:如何配置你的软件、如何实现 Stata 与 Python 数据集互通、如何调用 Python 工具包、如何进行机器学习分析等。

  • Part 1: Setting up Stata to use Python -Link-
  • Part 2: Three ways to use Python in Stata -Link-
  • Part 3: How to install Python packages -Link-
  • Part 4: How to use Python packages -Link-
  • Part 5: Three-dimensional surface plots of marginal predictions -Link-
  • Part 6: Working with APIs and JSON data -Link-
  • Part 7: Machine learning with support vector machines, -Link-
  • Part 8: Using the Stata Function Interface to copy data from Stata to Python, -Link-
  • Part 9: Using the Stata Function Interface to copy data from Python to Stata, -Link-

中文编译稿列表如下:


目录


Stata16 已具有和 python 交互的功能,由此,我们可以在 Stata 中调用 python,也可以在 python 中读取 Stata 数据,从而实现“他山之石,可以攻玉”。本节我们将向大家介绍在 stata 中实现机器学习,我们将使用一个支持向量机(SVM)的栗子进行说明。

支持向量机(SVM)是一类按照监督学习方式进行二元分类的线性分类器,主要原理是求解最大间隔超平面,从而对样本进行二元分类。我们拟使用美国国家健康与营养调查数据( NHANES),调用 python 的 sklearn 模块在 stata 中应用机器学习以区分糖尿病患者。

1. 数据探索性分析

我们主要使用人口统计数据的年龄(age)、糖化血红蛋白(HbA1c)作为特征,使用是否是糖尿病(diabetes)作为因变量,经过数据的预处理与合并后,我们得到样本的初步描述。

. list in 1/5

     +------------------------+
     | diabetes   HbA1c   age |
     |------------------------|
  1. |        1       7    62 |
  2. |        0     5.5    53 |
  3. |        1     5.8    78 |
  4. |        0     5.6    56 |
  5. |        0     5.6    42 |
     +------------------------+

我们按照因变量分组统计,得到样本的初步描述,87.49%的患者未患有糖尿病,12.51%的患者患有糖尿病。

. tabulate diabetes

Doctor told |
   you have |
   diabetes |      Freq.     Percent        Cum.
------------+-----------------------------------
          0 |      5,531       87.49       87.49
          1 |        791       12.51      100.00
------------+-----------------------------------
      Total |      6,322      100.00

接下来,我们对原始数据进行绘制,我们试图探查不同特征是否可以区分患者是否有糖尿病,由此,我们调用 python 的 matplotlib 模块进行绘图。在 stata 中调用 python 可以参见stata 的代码文档,安装好之后,在命令窗口内输入 python 即可调用 python,以 end 作为 python 代码的结束。我们使用 python 来进行绘图,我们将糖化血红蛋白作为 y 轴、年龄作为 x 轴,蓝色点为未患有糖尿病的样本点,红色点为患有糖尿病的样本点。

python:
# Import the necessary packages
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

# Read the Stata dataset into Python
data = pd.read_stata('diabetes.dta',
convert_categoricals=False,
preserve_dtypes=True,
convert_missing=False)

# Define the feature matrix (independent variables)
# and the target variable (dependent variable)
X = data[['age','HbA1c']]
y = data['diabetes']

# Plot the raw data
plt.scatter(X['age'], X['HbA1c'],
c=y,
cmap = mcolors.ListedColormap(["navy", "darkred"]))
plt.xlabel('Age (years)')
plt.ylabel('HbA1c')
plt.xticks((12,20,30,40,50,60,70,80))
plt.yticks((4,6,8,10,12,14,16))
plt.title('Diabetes status by Age and HbA1c')
plt.show()
# Save the graph
plt.savefig("scatterplot.png")
end

按照年龄与糖化血红蛋白区分的糖尿病患者 由图中显示,患有糖尿病的人往往年龄较大、糖化血红蛋白的水平较高。

2. 使用交叉验证来拟合最优 SVM 模型

接下来,我们使用 python 的 sklearn 模块来进行机器学习建模,我们首先按照 40%与 60%的比例随机划分测试集与训练集。

python:
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4,
random_state=0)
end

其次,我们使用交叉验证的方法来拟合最优的 SVM 模型,我们需要寻找到最优的核函数(kernel)、度(degree)和正则化参数(regularization parameter C),我们在此对 SVM 模型的基本概念不加以赘述,可以参加过往的推送来更深入的了解 SVM 模型。

我们使用“k-折交叉验证”的技术,把训练组划分为 k 个子组,在 k-1 个子组上训练 SVM 模型,在第 k 个子组上测试模式,我们重复 k 次使每个子组都作为测试组,然后,我们将计算的结果计算平均值,选择拟合度度最好的模型参数作为真正拟合的参数。调用 python 的 sklearn 模块代码如下:

python:
from sklearn import svm
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV

# Do a grid search for the parameters "degree" and "C" using 10-fold
# cross-validation
model = svm.SVC(kernel='poly')
parameters = {'degree':[1,2,3], 'C':[1,2,3]}
poly_svc = GridSearchCV(model,
parameters,
cv=10,
scoring='accuracy').fit(X_train, y_train)

# Display the parameters that yield the best-fitting model
poly_svc.fit(X_train,y_train)
print(poly_svc.best_params_)
end

由结果可知,我们选取正则化参数(C)为 3、度(degree)为 3 的 SVM 拟合效果最好,由此,我们将 poly_svc 的模型作为拟合测试集的模型。

>>> poly_svc.fit(X_train,y_train)
GridSearchCV(cv=10, estimator=SVC(kernel='poly'),
             param_grid={'C': [1, 2, 3], 'degree': [1, 2, 3]},
             scoring='accuracy')
>>> print(poly_svc.best_params_)
{'C': 3, 'degree': 3}

3. 在测试集上拟合模型

通过交叉验证法拟合到最优的 SVM 模型后,我们在测试集上进行拟合,并展示模型的准确性。

# Fit the SVM model using the parameters selected from the grid search
poly_svc = svm.SVC(kernel='poly', degree=3, C=3).fit(X_train, y_train)
scores = cross_val_score(poly_svc, X_test, y_test, cv=10, scoring='accuracy')
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

>>> Accuracy: 0.93 (+/- 0.03)

由结果可知,使用 SVM 模型拟合的准确度为 93%。接下来我们对拟合结果进行绘图。

绘制拟合边界
绘制拟合边界

4. 结论

我们通过在 stata 中调用 python,实现了使用 SVM 算法将样本划分为糖尿病患者与非糖尿病患者,我们将测试集数据按照 93%的正确率来分类,我们也可以调用 python 的其他模型来进行机器学习,譬如随机森林、logi 回归等,总之,stata16 与 python 的交互实现了软件间功能的互通,为我们的学习与研究增添了一大有利工具。

5. 参考资料

6. 相关推文

Note:产生如下推文列表的命令为:
lianxh Stata Python +
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,400+ 推文,实证分析不再抓狂。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh