Точечная диаграмма выдает TypeError

avatar
Tranquil Oshan
8 апреля 2018 в 05:17
1098
1
2

Я пытаюсь использовать следующий код:

from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
from sklearn.linear_model import LogisticRegression
from sklearn import linear_model
model = linear_model.LogisticRegression()
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error, r2_score

X=scaler.fit_transform(X)

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)

model.fit(X_train,y_train)
# Make predictions using the testing set
powerOutput_y_pred = model.predict(X_test)
print (powerOutput_y_pred)
# The coefficients
print('Coefficients: \n', model.coef_)
# The mean squared error
print("Mean squared error: %.2f"
      % mean_squared_error(y_test, powerOutput_y_pred))
# Explained variance score: 1 is perfect prediction
print('Variance score: %.2f' % r2_score(y_test, powerOutput_y_pred))

plt.scatter(X_test, y_test,  color='black')
plt.plot(X_test, powerOutput_y_pred, color='blue', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()

Но я получаю следующую ошибку для точечной диаграммы:

ValueError: x and y must be the same size

Если я запускаю df.head(), я получаю следующую таблицу:

структура df

Характеристики X и y приведены ниже:

X=df.values[:,[0,1,2,3,4,5,7]]
y=df.values[:,6]

Запуск X.shape дает (25,7) и y.shape дает (25, ) в качестве вывода. Итак, как исправить это несоответствие формы?

Источник
eric
8 апреля 2018 в 05:34
0

Как вы ожидаете, будет выглядеть точечная диаграмма? То есть, какие отношения вы пытаетесь построить?

Tranquil Oshan
8 апреля 2018 в 05:49
0

Я пытаюсь следовать этому: scikit-learn.org/stable/auto_examples/linear_model/… Но здесь используется только одна функция. Я пытаюсь использовать многие 7 функций в X.

tel
8 апреля 2018 в 07:46
1

Лучший ответ оказался даже проще, чем я думал. Если вы просто замените scatter на plot, все должно работать как есть. Если вы правильно установите несколько параметров (ls, marker и ms), вызов plot создаст точечную диаграмму.

Ответы (1)

avatar
tel
8 апреля 2018 в 06:23
2

Самый простой ответ

Просто используйте plot вместо scatter:

plt.plot(X_test, y_test, ls="none", marker='.', ms=12)

Это позволит отобразить различные наборы данных x, используя один и тот же набор данных y. Это предполагает, что x.shape == (n,d) и y.shape == (n,), как в вашем вопросе выше.

Простой ответ

Переберите столбцы ваших значений x и вызовите scatter один раз для каждого столбца:

colors = plt.cm.viridis(np.linspace(0.0, 1.0, features))
for xcol,c in zip(X_test.T, colors):
    plt.scatter(xcol, y_test, c=c)

Установка c с массивом colors сделает так, что каждая функция будет отображаться на диаграмме рассеяния своим цветом. Если вы хотите, чтобы все они были черными, просто замените указанные выше цвета на c='black'

.

детали

scatter ожидает один список значений x и один список значений y. Проще всего, если список x и y одномерный. Однако вы также можете построить несколько наборов данных x и y, хранящихся в 2D-массивах, если эти массивы имеют совпадающую форму.

Из документов Matplotlib:

По сути, разброс работает с одномерными массивами; x, y, s и c могут быть введены как двумерные массивы, но внутри разброса они будут сглажены.

Немного расплывчато, но погружение в исходный код Matplotlib подтверждает, что формы x и y должны точно совпадать. Код, который обрабатывает фигуры для plot, более гибкий, поэтому для этой функции вы можете обойтись без использования одного набора данных y для многих наборов данных x.

Обычно plot отображает линии вместо точек, но вы можете отключить линии, установив ls (например, linestyle), и вы можете включить точки, установив marker. ms (т.е. markersize) управляет размером точек.

пример

Приведенный выше пример не запустится (X и y не определены), но вот полный пример с выводом:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

from sklearn import datasets
from sklearn.model_selection import train_test_split

d = datasets.load_diabetes()
features = d.data.shape[1]

X = d.data[:50,:]
Y = d.target[:50]

sample_weight = np.random.RandomState(442).rand(Y.shape[0])

# split train, test for calibration
X_train, X_test, Y_train, Y_test, sw_train, sw_test = \
    train_test_split(X, Y, sample_weight, test_size=0.9, random_state=442)

# use the plot function instead of scatter
# plot one set of y data against several sets of x data
plt.plot(X_test, Y_test, ls="none", marker='.', ms=12)

# call .scatter() multiple times in a loop
#colors = plt.cm.viridis(np.linspace(0.0, 1.0, features))
#for xcol,c in zip(X_test.T, colors):
#    plt.scatter(xcol, Y_test, c=c)

выход:

enter image description here

Tranquil Oshan
8 апреля 2018 в 07:04
0

Простой ответ, кажется, работает нормально, но для простого ответа я вижу, что y.shape все еще такой же, как y.T.shape, поэтому он не работает.