如何在Python中使用决策树进行分类和回归分析

2023-04-14 00:00:00 分析 回归 进行分类

在Python中,我们可以使用scikit-learn库来使用决策树进行分类和回归分析。接下来我们将对这个过程进行详细解释。

  1. 导入必要的库

我们需要导入以下库:numpy、pandas、scikit-learn。其中numpy和pandas用于数据处理,scikit-learn用于建立决策树。

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
  1. 数据处理

首先我们需要准备数据。我们可以通过Pandas库读取CSV文件或手动创建数据集。

例如,我们创建一个分类数据集:

data = pd.DataFrame({
   'Name': ['John', 'Mike', 'Jane', 'Sarah', 'Sam', 'Lee', 'Paul', 'Steven', 'Tom'], 
   'Age' : [25, 30, 18, 40, 35, 28, 18, 22, 37],
   'Education' : ['Bachelor', 'Master', 'Bachelor', 'PhD', 'Bachelor', 'Master', 'Master', 'PhD', 'Bachelor'],
   'Sex' : ['Male', 'Male', 'Female', 'Female', 'Male', 'Male', 'Male', 'Male', 'Male'],
   'Income' : [50000, 80000, 25000, 125000, 75000, 60000, 90000, 45000, 98000],
   'Class' : ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C']
})

这里我们创建了一个包含了Name、Age、Education、Sex、Income和Class列的数据集。

  1. 特征工程

接下来我们需要对数据进行特征工程处理。这个过程包括了特征选择、特征提取和特征变换。

首先我们需要将字符串类型的特征值转换为数值类型。在这个例子中,我们将Education和Sex列的值转换为数值类型。

data['Education'] = data['Education'].map({'Bachelor': 1, 'Master': 2, 'PhD': 3})
data['Sex'] = data['Sex'].map({'Male': 1, 'Female': 0})

然后我们需要将特征值和目标列分离出来,以便我们可以将数据集分为训练集和测试集。

X = data.drop(['Name', 'Class'], axis = 1) 
y = data['Class']
  1. 模型训练

现在我们已经准备好数据,可以开始训练决策树模型了。

在分类问题中,我们可以使用DecisionTreeClassifier类:

clf = DecisionTreeClassifier()
clf.fit(X, y)

在回归问题中,我们可以使用DecisionTreeRegressor类:

clf = DecisionTreeRegressor()
clf.fit(X, y)

这里的X是特征值矩阵,y是目标列。

  1. 预测

现在,我们已经训练好了模型,可以使用predict()函数来对新数据进行预测:

new_data = np.array([[30, 2, 1, 1, 70000]])
clf.predict(new_data)

这里的new_data包含了一个新样本的特征值。predict()函数返回的是该样本的预测值。

  1. 模型评估

我们可以通过测试数据集来评估模型的性能。在这个例子中,我们将数据集分为训练集和测试集:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 1)

clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)

这里我们使用了train_test_split()函数将数据集划分为训练集和测试集。我们在训练集上训练模型,然后在测试集上进行预测,最终使用accuracy_score()函数评估模型性能。

from sklearn.metrics import accuracy_score

print('Accuracy: ', accuracy_score(y_test, y_pred))

这里的accuracy_score()函数返回的是预测准确率。

完整代码演示:

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 数据处理
data = pd.DataFrame({
   'Name': ['John', 'Mike', 'Jane', 'Sarah', 'Sam', 'Lee', 'Paul', 'Steven', 'Tom'], 
   'Age' : [25, 30, 18, 40, 35, 28, 18, 22, 37],
   'Education' : ['Bachelor', 'Master', 'Bachelor', 'PhD', 'Bachelor', 'Master', 'Master', 'PhD', 'Bachelor'],
   'Sex' : ['Male', 'Male', 'Female', 'Female', 'Male', 'Male', 'Male', 'Male', 'Male'],
   'Income' : [50000, 80000, 25000, 125000, 75000, 60000, 90000, 45000, 98000],
   'Class' : ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C']
})

data['Education'] = data['Education'].map({'Bachelor': 1, 'Master': 2, 'PhD': 3})
data['Sex'] = data['Sex'].map({'Male': 1, 'Female': 0})

X = data.drop(['Name', 'Class'], axis = 1) 
y = data['Class']

# 模型训练
clf = DecisionTreeClassifier()
clf.fit(X, y)

# 预测
new_data = np.array([[30, 2, 1, 1, 70000]])
print(clf.predict(new_data))

# 模型评估
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 1)

clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)

print('Accuracy: ', accuracy_score(y_test, y_pred))

相关文章