Perceptron.t_ appears off by 1

### Describe the bug

The [docs](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Perceptron.html) state that `Perceptron.t_` is the "[n]umber of weight updates performed during training" and that it should be the "[s]ame as `(n_iter_ * n_samples)`." However, the value returned is actually equal to `n_iter_ * n_samples + 1`.

I believe this is an off-by-one bug due to the initial value of 1.0 given to `t_` on [line 684](https://github.com/scikit-learn/scikit-learn/blob/32f9deaaf27c7ae56898222be9d820ba0fd1054f/sklearn/linear_model/_stochastic_gradient.py#L684) in the `_fit` method of `BaseSGDClassifier`. This value then gets added to in one of the later methods, for instance on [line 730](https://github.com/scikit-learn/scikit-learn/blob/32f9deaaf27c7ae56898222be9d820ba0fd1054f/sklearn/linear_model/_stochastic_gradient.py#L615) in the `_fit_binary` method: `self.t_ += n_iter_ * X.shape[0]`. If this is the issue, then [Line 615](https://github.com/scikit-learn/scikit-learn/blob/32f9deaaf27c7ae56898222be9d820ba0fd1054f/sklearn/linear_model/_stochastic_gradient.py#L615) in the `_partial_fit` method would also probably have to be adjusted.

Or, is this a docs issue?

I'd be willing to PR a fix for either reason (either change the default value or update the docs to reflect the `+ 1`), but I couldn't find a reason for why `t_` is initialized to 1.0.

### Steps/Code to Reproduce

```python
from sklearn.linear_model import Perceptron
import numpy as np

n_samples = 5
X = np.zeros((n_samples, 1))
y = np.array([x % 2 for x in range(n_samples)])

ppn = Perceptron().fit(X, y)
```

### Expected Results

```python
ppn.t_ == ppn.n_iter_ * n_samples
```

### Actual Results

```python
ppn.t_ == ppn.n_iter_ * n_samples + 1
```

### Versions

```shell
System:
    python: 3.10.4 | packaged by conda-forge | (main, Mar 24 2022, 17:38:57) [GCC 10.3.0]
executable: /home/doug/miniconda3/envs/cs434/bin/python
   machine: Linux-5.10.102.1-microsoft-standard-WSL2-x86_64-with-glibc2.31

Python dependencies:
      sklearn: 1.1.0
          pip: 22.1
   setuptools: 62.2.0
        numpy: 1.22.3
        scipy: 1.8.0
       Cython: None
       pandas: 1.4.2
   matplotlib: 3.5.2
       joblib: 1.1.0
threadpoolctl: 3.1.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
         prefix: libopenblas
       filepath: /home/doug/miniconda3/envs/cs434/lib/libopenblasp-r0.3.20.so
        version: 0.3.20
threading_layer: pthreads
   architecture: Haswell
    num_threads: 8

       user_api: openmp
   internal_api: openmp
         prefix: libgomp
       filepath: /home/doug/miniconda3/envs/cs434/lib/libgomp.so.1.0.0
        version: None
    num_threads: 8
```

COMMENT:
I think the reason why `t_` is initialized to 1.0 is for `_plain_sgd` which is called here:

https://github.com/scikit-learn/scikit-learn/blob/ebab121f19e00b4e76d239198fd238c2de65cfac/sklearn/linear_model/_stochastic_gradient.py#L1644

which assumes the starting point to be `1.0`:

https://github.com/scikit-learn/scikit-learn/blob/ebab121f19e00b4e76d239198fd238c2de65cfac/sklearn/linear_model/_sgd_fast.pyx#L382

This is a tough call. I slightly prefer changing `t_` to start at `0.0` and treat it as a bug fix, but it will be backward incompatible.

Labels: Documentation, module:linear_model