【问题标题】:scikit indices out of boundsscikit 索引超出范围
【发布时间】:2017-04-23 09:29:36
【问题描述】:

我是 scikit 的新手,在尝试让学习者适应采样训练集时出现索引超出范围错误

这里是错误发生的地方

def train_predict(learner, sample_size, X_train, y_train, X_test, y_test): 


    results = {}
    start = time() # Get start time
    learner.fit(X_train[sample_size],y_train[sample_size])
    end = time() # Get end time

    results['train_time'] = end-start

    start = time() # Get start time
    predictions_test = learner.predict(X_test)
    predictions_train = learner.predict(X_train.head(300))
    end = time() # Get end time

    results['pred_time'] = end-start

    results['acc_train'] = accuracy_score(y_train.head(300),predictions_train)

    results['acc_test'] = accuracy_score(y_test,predictions_test)

    results['f_train'] = f_score(y_train.head(300),predictions_train)

    results['f_test'] = f_score(y_test,predictions_test)

    print "{} trained on {} samples.".format(learner.__class__.__name__, sample_size)

    return results

这里是主要代码

    clf_A = GaussianNB()
    clf_B = tree.DecisionTreeClassifier()
    clf_C = SVC()

    samples_1 = random.sample(X_train.index,len(X_train)/100)
    samples_10 = random.sample(X_train.index,len(X_train)/10)
    samples_100 = X_train.index

    results = {}
    for clf in [clf_A, clf_B, clf_C]:
        clf_name = clf.__class__.__name__
        results[clf_name] = {}
        for i, samples in enumerate([samples_1, samples_10, samples_100]):
             results[clf_name][i] = \
             train_predict(clf, samples, X_train, y_train, X_test, y_test)


     vs.evaluate(results, accuracy, fscore)

错误在一行

---> 21     learner.fit(X_train[sample_size],y_train[sample_size])

它说

IndexError: indices are out-of-bounds

【问题讨论】:

  • 您是否尝试打印X_train 的长度和sample_size 的值?
  • 我做了,X_train 是 36177 samples_1 是 361,samples_10 是 3617
  • 不,我的意思是这个错误出现在哪个迭代上? samples_100呢?
  • train_predict(clf, samples, X_train, y_train, X_test, y_test) 方法调用中,您正在传递sample,但是train_predict 方法需要sample_size...

标签: python pandas numpy scikit-learn


【解决方案1】:

您的错误完全取决于 X_train 和 y_train 的样子。

一个可能适合您情况的常见示例: 如果这些是 pandas 数据框对象,那么修复您的解决方案可能就像添加 .as_matrix() 一样简单,如下所示:

learner.fit(X_train.as_matrix()[sample_size],y_train.as_matrix()[sample_size])

您可以快速检查的另一件事是 X_train[sample_size] 返回的行数和 y_train[sample_size] 返回的行数相同。请注意,这与以下评估结果相同,因为 X_train[sample_size] 可以有比 y_train[sample_size] 更多的列:

len(X_train[sample_size]) == len(y_train[sample_size])

在您的问题中提供有关 X_train 和 y_train 是如何构建的信息或关于它们的类型和形状的详细信息将为您提供更具体的答案。

【讨论】:

    【解决方案2】:

    试试下面的

    learner.fit(X_train[**0:sample_size**],y_train[**0:sample_size**])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多