在pandas 中加载数据
要打开此数据集(csv 文件),我们将在 Pandas 中使用命令read_csv
:
import pandas
data = pandas.read_csv("file_name.csv")
Numpy 数组
我们已经在 Pandas 中加载数据,现在需要将输入和输出拆分为 numpy 数组,以便在 scikit-learn 中应用分类器。方法如下:假设有个 pandas 数据框 df,如下所示,有四个列,分别标为 A、B、C、D:
如果我们想要提取列 A,则执行以下操作:
df['A']
现在,如果我们希望获取更多的列(columns),则执行以下操作:
df[['B', 'D']]
最后,我们将这些 pandas DataFrames 转变为 NumPy 数组。这个操作的命令语句很简单:
numpy.array(df)
现在你自己试试!使用我们之前在 pandas 中加载的同一数据框,将其拆分为特征 X 和标签 y,并将它们转变为NumPy数组。
import pandas as pd
import numpy as np
data = pd.read_csv("data.csv")
# TODO: Separate the features and the labels into arrays called X and y
X = np.array(data[['x1', 'x2']])
y = np.array(data['y'])
在scikit learn 中训练模型
定义分类器
- 逻辑回归
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
- 神经网络
from sklearn.neural_network import MLPClassifier
classifier = MLPClassifier()
- 决策树
from sklearn.ensemble import GradientBoostingClassifier
classifier = GradientBoostingClassifier()
- 支持向量机
from sklearn.svm import SVC
classifier = SVC()
示例
我们从头到尾地看看如何读取数据和训练分类器。假设使用上一部分的 X 和 y。然后,以下命令将训练逻辑回归分类器:
你的目标是使用上述其中一个分类器(逻辑回归、决策树或支持向量机,抱歉,此版本的 sklearn 依然无法使用神经网络,但是我们即将更新!),看看哪个分类器能够更好地拟合数据。点击测试答案看看分类器的图形输出,然后在下面的练习中,输入你认为能更好地拟合数据的分类器!
import pandas
import numpy as np
import matplotlib.pyplot as plt
# Read the data
data = pandas.read_csv('data.csv')
# Split the data into X and y
X = numpy.array(data[['x1', 'x2']])
y = numpy.array(data['y'])
# import statements for the classification algorithms
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
#决策边界
def plot_decision_boundary(pred_func):
# 设定最大最小值,附加一点点边缘填充
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
h = 0.01
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# 用预测函数预测一下
Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 然后画出图
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
# Logistic Regression Classifier
classifier = LogisticRegression()
classifier.fit(X,y)
plot_decision_boundary(lambda x: classifier.predict(x))
plt.show()
# Decision Tree Classifier
classifier = DecisionTreeClassifier()
classifier.fit(X,y)
plot_decision_boundary(lambda x: classifier.predict(x))
plt.show()
# Support Vector Machine Classifier
classifier = SVC()
classifier.fit(X,y)
plot_decision_boundary(lambda x: classifier.predict(x))
plt.show()
手动调整参数
似乎逻辑回归的效果不太理想,因为它是线性算法。决策树能够很好地划分数据(问题:决策树的界限区域为何是那样的?),SVM 的效果非常棒。现在我们试试稍微复杂些的数据集,如下所示:
我们试着用 SVM 分类器拟合此数据,如下所示:
classifier = SVC()
classifier.fit(X,y)
如果输入上述内容,将失败(你将有机会在下面试试)。但是,也许我们没有充分利用 SVM 分类器。首先,我们使用了正确的内核吗?例如,我们可以使用 2 次多项式内容,如下所示:
classifier = SVC(kernel = 'poly', degree = 2)
- kernel: linear (线性), poly(多项式), rbf(高斯核)
- degree(整型):多项式内核的次数(如果选择了多项式内核)
- gamma (浮点型):γ 参数
- C(浮点型):C 参数
进行测试
使用 sklearn 可以轻松地将数据集拆分为训练数据和测试数据。我们只需输入 train_test_split
命令。该函数获得输入 X 和 y,然后返回四项内容:
- X_train:训练输入数据
- X_test:测试输入数据
- y_train:训练标签
- y_test:测试标签
该函数的调用如下所示:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)
最后一个参数 test_size 是我们想用作测试数据的点所占百分比。在上述调用中,我们使用 25% 的点作为测试数据,75% 作为训练数据。