在学习机器学习的时候,各种数据集也都玩遍了,我们都接触的是有 2 个特征或者更多个特征的数据集,这次来一点不一样的,只有一个特征的数据集!
检查版本
首先需要检查 scikit-learn 版本,因为今天的问题老版本可能不会有,当然我的版本有这个问题。给大家看一下我的 scikit-learn 版本,如图所示。
先模仿一下
我首先模仿之前学习机器学习的代码格式,如下所示:
代码语言:javascript复制from pandas import DataFrame
from random import random, choice
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
df = DataFrame({'X0': [random()for _ in range(100)], 'y': [choice((0, 1))for _ in range(100)]})
X, y = df['X0'], df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
knn = KNeighborsClassifier().fit(X_train, y_train)
print(knn.score(X_test, y_test))
这个例子很简单,数据集中共有 100 条数据就一个特征 X0,y 表示类别,有 0 和 1 两个类别,接下来运行一下看看行不行,如图所示。
稍微翻译一下:期望接收到一个二维数组,但是传进去的却是一个一维数组,这种情况怎么办呢?很简单~!把它转换成二维数组不就完事了吗?
转二维数组
转二维数组的逻辑非常简单,把 X, y = df['X0'], df['y'] 这一行改成 X, y = [df['X0']], df['y'] 就行了,转换之后再运行一下看看,如图所示。
还是报错,稍微翻译一下:发现输入变量和样本数量不一致,哈?!这个是什么鬼?!这是因为特征的行数与类别的行数不相等,我们先打印一下 X 的形状看看,如图所示。
1 行 100 列,好了,解决方案已经很明显了,把 X 做一个转置就行了。代码如下:
代码语言:javascript复制from pandas import DataFrame
from random import random, choice
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from numpy import array
df = DataFrame({'X0': [random()for _ in range(100)], 'y': [choice((0, 1))for _ in range(100)]})
X, y = array([df['X0']]).T, df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
knn = KNeighborsClassifier().fit(X_train, y_train)
print(knn.score(X_test, y_test))
运行结果如图所示。
只要看到没有报错就行了,打印出来的评估分数看看就好,毕竟我为了讲解而生成的数据是随机和没有实际意义的数据