机器学习模型完成:运用Keras从常规调查数据中检测抑郁症
作者头像
  • 博览群书
  • 2019-01-04 20:15:49 0

根据世界卫生组织(WHO)的数据,抑郁症是全球范围内影响最严重的心理健康问题之一,影响人数超过3亿。除了抑郁症对个人和社会造成的严重后果外,近年来与心理健康的经济负担也在不断增加。据统计,全球每年因心理健康的支出已超过1万亿美元。

在本教程中,我们将利用Keras构建一个简单的神经网络模型,以预测哪些人可能患有抑郁症。Keras是一个用Python编写的高级神经网络API,可以运行在TensorFlow、CNTK或Theano之上。此外,我们还会评估该模型的准确率,并将其与基于随机森林算法的基准模型进行比较。

加载所需库

我们首先导入必要的库来处理数据并构建机器学习模型:

python import pandas as pd import numpy as np import re from keras.models import Sequential from keras.layers import Dense from keras.preprocessing import sequence

导入数据集

我们将使用Busara提供的心理健康数据集,可以从Zindi数据科学竞赛平台下载。我们使用pandas来读取训练集和测试集。训练集将用于训练模型,而测试集将用于预测。

```python

训练集

dftrain = pd.readcsv('data/busara/train.csv')

测试集

dftest = pd.readcsv('data/busara/test.csv')

显示训练数据的形状

df_train.shape ```

数据预处理

数据质量不佳常常导致数据缺失问题,这会影响机器学习模型的准确性。因此,我们需要处理缺失数据。下面的函数可以计算并打印出每列的缺失值百分比。

python def missing_values_table(df): # 总缺失值 mis_val = df.isnull().sum() # 缺失值的百分比 mis_val_percent = 100 * df.isnull().sum() / len(df) # 创建表格 mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1) # 重命名列 mis_val_table_ren_columns = mis_val_table.rename( columns={0: 'Missing Values', 1: '% of Total Values'}) # 按缺失百分比降序排列 mis_val_table_ren_columns = mis_val_table_ren_columns[ mis_val_table_ren_columns.iloc[:, 1] != 0].sort_values( '% of Total Values', ascending=False).round(1) # 打印总结信息 print("该数据集有 " + str(df.shape[1]) + " 列。n" "有 " + str(mis_val_table_ren_columns.shape[0]) + " 列存在缺失值。") # 返回缺失信息 return mis_val_table_ren_columns

根据经验法则,可以考虑移除那些缺失值超过50%的列。对于训练数据集,我们发现有四列的缺失值超过了50%,因此我们决定删除这些列。

```python

获取缺失值超过50%的列

missingdf = missingvaluestable(dftrain) missingcolumns = list(missingdf[missingdf['% of Total Values'] > 50].index) print('n', '%d 列将被删除。' % len(missingcolumns))

删除缺失值超过50%的列

dftrain = dftrain.drop(columns=list(missing_columns)) ```

由于Keras神经网络只能处理数字数据,我们需要将某些文本数据转换成数字。例如,我们可以使用LabelEncoder将“survey_date”列中的文本转换为整数。

```python from sklearn.preprocessing import LabelEncoder

创建标签编码器

encoder = LabelEncoder()

将编码器应用于“survey_date”列

encodedtrain = encoder.fittransform(dftrain['surveydate'])

将转换后的列重新赋值给数据框

dftrain['surveydate'] = encoded_train ```

现在,我们需要确定输入和目标变量。输入将是除了“depressed”列以外的所有列,因为我们要预测的就是“depressed”这一列。

我们还需要处理那些缺失值少于50%的列。接下来,我们将数据分为训练集和测试集,并设定随机种子以保证结果的可复现性。

```python

分割数据

X = df_train.drop(['depressed'], axis=1)

使用均值填充缺失值

from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy='mean') transformedX = imputer.fittransform(X)

y = df_train['depressed']

from sklearn.modelselection import traintest_split

设定随机种子

seed = 5 test_size = 0.33

划分训练集和测试集

Xtrain, Xtest, ytrain, ytest = traintestsplit( transformedX, y, testsize=testsize, randomstate=seed) ```

构建分类模型

我们使用Keras构建一个简单的神经网络分类模型。Keras是一个易于使用的神经网络库,可以轻松地定义和训练模型。

```python

创建模型

model = Sequential() model.add(Dense(36, input_dim=70, activation='relu')) model.add(Dense(36, activation='relu')) model.add(Dense(1, activation='sigmoid')) ```

编译模型

在定义好模型后,我们需要对其进行编译。这里我们使用TensorFlow作为后端,指定损失函数、优化器和评估指标。

```python

编译模型

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) ```

训练模型

接下来,我们需要通过调用fit()函数来训练模型。模型将在给定的轮数内迭代数据。

```python

训练模型

model.fit(Xtrain, ytrain, epochs=100, batch_size=10) ```

评估模型

最后,我们评估模型在测试集上的表现。

```python

评估模型

scores = model.evaluate(Xtest, ytest) print("n%s: %.2f%%" % (model.metrics_names[1], scores[1] * 100)) ```

结果显示,该模型的准确率为86.51%,略高于随机森林基准模型的85.98%。

基准模型

为了对比,我们还构建了一个随机森林基准模型:

```python from sklearn.ensemble import RandomForestClassifier from sklearn import metrics

创建随机森林模型

logreg = RandomForestClassifier() logreg.fit(Xtrain, ytrain)

预测

ypred = logreg.predict(Xtest)

评估准确率

accuracy = metrics.accuracyscore(ytest, y_pred) print("Accuracy: %.2f%%" % (accuracy * 100.0)) ```

通过这种方式,我们可以更清晰地展示如何使用Keras构建神经网络模型,并将其与随机森林模型进行比较。

    本文来源:图灵汇
责任编辑: : 博览群书
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
抑郁症常规模型运用机器检测完成调查数据学习
    下一篇