温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh
作者:吕卓阳(厦门大学)
E-Mail:lvzy20@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 工具包、如何进行机器学习分析等。
中文编译稿列表如下:
目录
Stata16 已具有和 python 交互的功能,由此,我们可以在 Stata 中调用 python,也可以在 python 中读取 Stata 数据,从而实现“他山之石,可以攻玉”。本节我们将向大家介绍在 stata 中实现机器学习,我们将使用一个支持向量机(SVM)的栗子进行说明。
支持向量机(SVM)是一类按照监督学习方式进行二元分类的线性分类器,主要原理是求解最大间隔超平面,从而对样本进行二元分类。我们拟使用美国国家健康与营养调查数据( NHANES),调用 python 的 sklearn 模块在 stata 中应用机器学习以区分糖尿病患者。
我们主要使用人口统计数据的年龄(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
由图中显示,患有糖尿病的人往往年龄较大、糖化血红蛋白的水平较高。
接下来,我们使用 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}
通过交叉验证法拟合到最优的 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%。接下来我们对拟合结果进行绘图。
我们通过在 stata 中调用 python,实现了使用 SVM 算法将样本划分为糖尿病患者与非糖尿病患者,我们将测试集数据按照 93%的正确率来分类,我们也可以调用 python 的其他模型来进行机器学习,譬如随机森林、logi 回归等,总之,stata16 与 python 的交互实现了软件间功能的互通,为我们的学习与研究增添了一大有利工具。
Note:产生如下推文列表的命令为:
lianxh Stata Python +
安装最新版lianxh
命令:
ssc install lianxh, replace
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟,课程主页 Stata 33 讲 - 连玉君, 每讲 15 分钟. Stata 小白的取经之路 - 龙志能,时长:2 小时,课程主页 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh