自己编写决策树和KNN算法实现心脏病预测,并进行算法调优和比较评估
时间: 2024-01-14 22:04:58 浏览: 92
好的,下面我会详细介绍如何实现决策树和KNN算法进行心脏病预测。
首先,我们需要准备数据集。可以使用UCI Machine Learning Repository上的Heart Disease数据集,其中包含了303个样本和14个特征,其中13个特征是用来预测心脏病的,最后一个特征是标签,表示是否患有心脏病。
接下来,我们将数据集分为训练集和测试集,其中训练集用于训练模型,测试集用于评估模型的性能。
代码如下:
```
import pandas as pd
from sklearn.model_selection import train_test_split
# 加载数据集
data = pd.read_csv('heart.csv')
# 将数据集分为特征和标签
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```
接下来,我们将使用决策树算法和KNN算法进行心脏病预测。
## 决策树算法
决策树算法是一种基于树形结构的分类算法。它通过对数据集的划分,将数据划分为不同的子集,以此来构建一个决策树。决策树的每个节点表示一个特征,每个分支表示一个特征的取值,最终的叶子节点表示一个分类结果。
我们可以使用sklearn库中的DecisionTreeClassifier来实现决策树算法。代码如下:
```
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# 创建决策树模型
clf = DecisionTreeClassifier()
# 训练决策树模型
clf.fit(X_train, y_train)
# 使用测试集评估模型性能
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
```
这里我们使用accuracy_score函数来计算模型在测试集上的准确率。
接下来,我们可以对决策树算法进行调优,以提高模型的性能。可以调整的参数包括决策树的最大深度、叶子节点最少样本数等。我们可以使用GridSearchCV来进行参数搜索。代码如下:
```
from sklearn.model_selection import GridSearchCV
# 定义参数搜索范围
params = {
'max_depth': [3, 5, 7, 9],
'min_samples_leaf': [1, 3, 5]
}
# 创建GridSearchCV对象
clf = DecisionTreeClassifier()
grid_search = GridSearchCV(clf, params, cv=5)
# 训练GridSearchCV模型
grid_search.fit(X_train, y_train)
# 输出最优参数和最优准确率
print("Best Parameters:", grid_search.best_params_)
print("Best Accuracy:", grid_search.best_score_)
```
这里我们使用GridSearchCV来搜索最优的决策树参数,包括最大深度和叶子节点最少样本数。我们使用cv=5来进行交叉验证,找到最优参数后输出最优准确率。
## KNN算法
KNN算法是一种基于邻居的分类算法。它通过计算测试样本与训练集中每个样本的距离,选取距离最近的K个样本作为邻居,然后根据邻居的标签来预测测试样本的标签。
我们可以使用sklearn库中的KNeighborsClassifier来实现KNN算法。代码如下:
```
from sklearn.neighbors import KNeighborsClassifier
# 创建KNN模型
clf = KNeighborsClassifier()
# 训练KNN模型
clf.fit(X_train, y_train)
# 使用测试集评估模型性能
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
```
和决策树算法类似,我们可以对KNN算法进行调优,以提高模型的性能。可以调整的参数包括K值、距离度量方法等。同样,我们可以使用GridSearchCV来进行参数搜索。代码如下:
```
# 定义参数搜索范围
params = {
'n_neighbors': [3, 5, 7, 9],
'metric': ['euclidean', 'manhattan']
}
# 创建GridSearchCV对象
clf = KNeighborsClassifier()
grid_search = GridSearchCV(clf, params, cv=5)
# 训练GridSearchCV模型
grid_search.fit(X_train, y_train)
# 输出最优参数和最优准确率
print("Best Parameters:", grid_search.best_params_)
print("Best Accuracy:", grid_search.best_score_)
```
这里我们使用GridSearchCV来搜索最优的KNN参数,包括K值和距离度量方法。同样,我们使用cv=5来进行交叉验证,找到最优参数后输出最优准确率。
最后,我们可以进行模型比较评估,选择性能最好的模型进行心脏病预测。在这里,我们使用准确率作为评估指标,因为数据集中正负样本比例不平衡。
代码如下:
```
# 创建最优决策树模型
clf_dt = DecisionTreeClassifier(max_depth=7, min_samples_leaf=1)
clf_dt.fit(X_train, y_train)
# 创建最优KNN模型
clf_knn = KNeighborsClassifier(n_neighbors=7, metric='euclidean')
clf_knn.fit(X_train, y_train)
# 在测试集上评估模型性能
y_pred_dt = clf_dt.predict(X_test)
accuracy_dt = accuracy_score(y_test, y_pred_dt)
print("Decision Tree Accuracy:", accuracy_dt)
y_pred_knn = clf_knn.predict(X_test)
accuracy_knn = accuracy_score(y_test, y_pred_knn)
print("KNN Accuracy:", accuracy_knn)
```
这里我们创建了最优的决策树模型和最优的KNN模型,并在测试集上评估了它们的准确率。通过比较准确率,我们可以选择性能最好的模型进行心脏病预测。
阅读全文