根据世界卫生组织(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
missingdf = missingvaluestable(dftrain) missingcolumns = list(missingdf[missingdf['% of Total Values'] > 50].index) print('n', '%d 列将被删除。' % len(missingcolumns))
dftrain = dftrain.drop(columns=list(missing_columns)) ```
由于Keras神经网络只能处理数字数据,我们需要将某些文本数据转换成数字。例如,我们可以使用LabelEncoder将“survey_date”列中的文本转换为整数。
```python from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
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构建神经网络模型,并将其与随机森林模型进行比较。