首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perceptron在线培训(scikit学习)

Perceptron在线培训(scikit学习)
EN

Stack Overflow用户
提问于 2017-04-29 16:01:18
回答 1查看 934关注 0票数 1

我编写了一个简单的程序来分类一组线性可分离的二维随机点。我用了一个感知器,我用合适的方法训练它。现在我想训练感知器一个点,每次用更新的权重绘制超平面(在本例中是一条线)。我想要的是一幅动画,它展示了线是如何变得越来越精确地划分集合的。fit方法需要整个训练集,那么partial_fit呢?我是否可以做一个循环,每次用一对新的输入/输出给方法,并连续读取coef_和intercept_?

我在这里阅读了model.SGDClassifier.html文档,但我对如何实现它有一些疑问。

编辑1

多亏了Vivek,我在代码中实现了partial_fit方法。程序创建2组坐标,每对产生一个输出,如果点在一条线上,则为-1。代码适用于fit方法,但是这个版本给数据形状带来了一些问题。我试图在没有任何改进的情况下对X数据使用理由。

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

def createLinearSet(nCamp, mTest, qTest):

    y_ = []
    X_ = np.random.rand(nCamp, 2)*20-10

    for n in range(nCamp):

        if X_[n][1] >= mTest*X_[n][0]+qTest :
            y_.append(1)
        else:
            y_.append(-1)

    return X_, y_

########################################################################
# VARIABLES
iterazioni = 100
eta = 0.6
y = []
error = []

########################################################################
# CREATING DATA SET
m_test = -2
q_test = 3
n_camp = 100

X, y = createLinearSet(n_camp, m_test, q_test)

########################################################################
# 70 % training data and 30 % test data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3,           random_state = 0)

########################################################################
# Data normalization
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train)                       # Calcola la media dei campioni e la deviazione standard
X_train_std = sc.transform(X_train)   # Normalizza i dati di test e di addestramento
X_test_std = sc.transform(X_test)     # NB. uso media e deviazione dei dati di add. per entrambi,  
                                      #     così sono confrontabili
########################################################################
# Perceptron initialization
from sklearn.linear_model import Perceptron
ppn = Perceptron(n_iter = iterazioni, eta0 = eta, random_state = 0)

########################################################################
# Online training
num_samples = X_train_std.shape[0]
classes_y =  np.unique(y_train)

X_train_std = X_train_std.reshape(-1, 2)

for i in range(num_samples):
    ppn.partial_fit(X_train_std[i], y_train[i], classes = classes_y )

########################################################################
# Using test data for evaluation
y_pred = ppn.predict(X_test_std)

########################################################################
# Previsions accuracy
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, y_pred) * 100

print("Accuracy: {} %".format(round(accuracy,2)))

print(ppn.coef_, ppn.intercept_) 

正如您所看到的,问题在于“在线培训”部分。错误是:

代码语言:javascript
复制
/usr/local/lib/python3.5/dist-packages/sklearn/utils/validation.py:395: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.

从文档来看,X必须是:x:{类似数组,稀疏矩阵},形状(n_samples,n_features)

如果我打印一个X的样本,输出是:-0.25547959 -1.4763508

错误在哪里?

编辑2

将行X_train_std[i].reshape(1,-1)放在循环中,它给我以下消息:Traceback (most recent call last): File "Perceptron_Retta_Online.py", line 57, in <module> ppn.partial_fit(X_train_std[i].reshape(1,-1), y_train[i], classes = classes_y ) File "/usr/local/lib/python3.5/dist-packages/sklearn/linear_model/stochastic_gradient.py", line 512, in partial_fit coef_init=None, intercept_init=None) File "/usr/local/lib/python3.5/dist-packages/sklearn/linear_model/stochastic_gradient.py", line 344, in _partial_fit X, y = check_X_y(X, y, 'csr', dtype=np.float64, order="C") File "/usr/local/lib/python3.5/dist-packages/sklearn/utils/validation.py", line 526, in check_X_y y = column_or_1d(y, warn=True) File "/usr/local/lib/python3.5/dist-packages/sklearn/utils/validation.py", line 562, in column_or_1d raise ValueError("bad input shape {0}".format(shape)) ValueError: bad input shape ()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-30 04:42:18

大多数科学估计器同时处理全部数据,即。当您调用fit()方法时,旧的训练(权重、系数等)会丢失,模型只适合于新的数据。

因此,要像您所说的那样实现它,您是正确的:“我做了一个循环,每次用新的一对输入/输出来输入方法,并连续读取coef_和intercept_",但略有改变。您需要输入所有以前的值和新的单个值,而不是输入新的一对输入/输出。

为了说明我的观点,您可以这样做(这是伪编码的,所以请阅读注释):

代码语言:javascript
复制
X = your_input
y = your_output
num_samples = X.shape[0]
for i in range(num_samples):

    # 1) This is necessary to initialize a new estimator everytime
    numpy.random.seed

    # 2) This is necessary to initialize a new estimator everytime
    estimator = MLPClassifier() OR SGDClassifier() OR ...

    # 3) Call fit on data from 0 to current index i
    estimator.fit(X[:i+1], y[:i+1])

    # Read the following values and do what you want
    estimator.coeff_ OR estimator.intercept_

解释性:1)在循环中设置随机种子参数,从而在所有循环中以相同(到相同的值)初始化权值。见第2点。

2)每次初始化新对象,而不是使用相同的对象(在循环之外初始化),因此分配给它的初始权重是随机的(并且由于第1点而固定)。

3)使用从0到当前索引到学习的所有值都是您想要的。对于第一个循环,它只有第一个值(索引0),对于第二个循环,它的第一个和第二个值,等等。

这种方法适用于所有的科学评估人员,但由于重复训练相同的数据点,需要花费大量的时间(如果数据非常大)。

ALTERNATIVE:当您链接到SGDClassifier时,我假设您可能对在线学习或核心外学习感兴趣,这正好满足了您的需求。但并不是所有的估测者都能做到这一点。只有在正式文件中列出的估计器才能做到这一点。

它们实现了一个partial_fit()方法,这正是您想要的。所以对他们来说,代码会是这样的:

代码语言:javascript
复制
X = your_input
y = your_output
num_samples = X.shape[0]

estimator = SGDClassifier() OR ... (which implements partial_fit())

for i in range(num_samples):

    estimator.fit(X[i], y[i])

    estimator.coeff_ OR estimator.intercept_

希望它清晰,并给你一个方法去做它。如果需要帮助,请随时询问。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43697731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档