如何将iris.csv转换为具有数据和目标的sci套件格式?

时间:2018-08-27 13:45:08

标签: python csv scikit-learn

我已经下载了经典的iris.csv文件(https://gist.github.com/netj/8836201),并尝试在不使用sci套件datasets.load_iris()功能的情况下进行k近距操作。

我想用自己的CSV替换datasets.load_iris(),以便对其进行修改并在以后与我自己的数据一起使用。 对于此代码,我得到此错误:

ValueError: n_samples=1 should be >= n_clusters=8

代码:

print(__doc__)

%matplotlib notebook
from pandas import read_csv
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.cluster import KMeans
from sklearn import datasets

np.random.seed(5)

iris = read_csv('iris.csv')
iris = iris.values
X = iris[:,3] # features
y = iris[:,4] # target

estimators = [('k_means_iris_8', KMeans(n_clusters=8)),
          ('k_means_iris_3', KMeans(n_clusters=3)),
          ('k_means_iris_bad_init', KMeans(n_clusters=3, n_init=1,
                                           init='random'))]

fignum = 1
titles = ['8 clusters', '3 clusters', '3 clusters, bad initialization']
for name, est in estimators:
    fig = plt.figure(fignum, figsize=(4, 3))
    ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
    est.fit(X)
    labels = est.labels_

    ax.scatter(X[:, 3], X[:, 0], X[:, 2],
               c=labels.astype(np.float), edgecolor='k')

    ax.w_xaxis.set_ticklabels([])
    ax.w_yaxis.set_ticklabels([])
    ax.w_zaxis.set_ticklabels([])
    ax.set_xlabel('Petal width')
    ax.set_ylabel('Sepal length')
    ax.set_zlabel('Petal length')
    ax.set_title(titles[fignum - 1])
    ax.dist = 12
    fignum = fignum + 1

fig = plt.figure(fignum, figsize=(4, 3))
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)

for name, label in [('Setosa', 0),
                    ('Versicolour', 1),
                    ('Virginica', 2)]:
    ax.text3D(X[y == label, 3].mean(),
              X[y == label, 0].mean(),
              X[y == label, 2].mean() + 2, name,
              horizontalalignment='center',
              bbox=dict(alpha=.2, edgecolor='w', facecolor='w'))

y = np.choose(y, [1, 2, 0]).astype(np.float)
ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y, edgecolor='k')

ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
ax.set_xlabel('Petal width')
ax.set_ylabel('Sepal length')
ax.set_zlabel('Petal length')
ax.set_title('Ground Truth')
ax.dist = 12
fig.show(

2 个答案:

答案 0 :(得分:1)

您还应该对标签进行编码,否则将无法正常工作。我也下载了它,仅更改以下代码即可让我完美运行。 (除了在代码末尾缺少缺少的结尾')',但我认为这是复制粘贴错误)

from sklearn import preprocessing
le = preprocessing.LabelEncoder()

np.random.seed(5)

iris = read_csv('iris.csv')
iris = iris.values
X = iris[:,:4] # features
y = le.fit_transform(iris[:,4]) # target

答案 1 :(得分:0)

执行此操作时:

X = iris[:,3] 

然后X仅是一列(第4个特征petal.width),这就是为什么您在est.fit()部分出现错误的原因,因为估计量认为您只有一个样本(我假设您使用的是scikit-learn的较旧版本。较新的版本会在此引发另一个更清晰的错误

将其更正为:

X = iris[:,:4] 

使用所有功能。

您为什么要y = np.choose(y, [1, 2, 0]).astype(np.float)