SklearnからLinearRegressionを使用しようとしていますが、「文字列をfloatに変換できませんでした」というメッセージが表示されます。データフレームのすべての列はfloatであり、出力yもfloatです。私は他の投稿を見てきました、そして提案は私がしたフロートに変換することです。
<class 'pandas.core.frame.DataFrame'>
Int64Index: 789 entries, 158 to 684
Data columns (total 8 columns):
f1 789 non-null float64
f2 789 non-null float64
f3 789 non-null float64
f4 789 non-null float64
f5 789 non-null float64
f6 789 non-null float64
OFF 789 non-null uint8
ON 789 non-null uint8
dtypes: float64(6), uint8(2)
memory usage: 44.7 KB
type(y_train)
pandas.core.series.Series
type(y_train[0])
float
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,Y,random_state=0)
X_train.head()
from sklearn.linear_model import LinearRegression
linreg = LinearRegression().fit(X_train, y_train)
私が得るエラーは
ValueError Traceback (most recent call last)
<ipython-input-282-c019320f8214> in <module>()
6 X_train.head()
7 from sklearn.linear_model import LinearRegression
----> 8 linreg = LinearRegression().fit(X_train, y_train)
510 n_jobs_ = self.n_jobs
511 X, y = check_X_y(X, y, accept_sparse=['csr', 'csc', 'coo'],
--> 512 y_numeric=True, multi_output=True)
513
514 if sample_weight is not None and np.atleast_1d(sample_weight).ndim > 1:
527 _assert_all_finite(y)
528 if y_numeric and y.dtype.kind == 'O':
--> 529 y = y.astype(np.float64)
530
531 check_consistent_length(X, y)
ValueError: could not convert string to float: '--'
助けてください。
簡単な解決策は、pd.to_numeric
を使用して、データに含まれる可能性のある文字列を数値に変換することです。変換と互換性がない場合は、NaN
sに削減されます。
from sklearn.linear_model import LinearRegression
X = X.apply(pd.to_numeric, errors='coerce')
Y = Y.apply(pd.to_numeric, errors='coerce')
さらに、これらの値にデフォルトを入力することを選択できます。
X.fillna(0, inplace=True)
Y.fillna(0, inplace=True)
塗りつぶしの値を、問題に関連するものに置き換えます。これらの行を削除することはお勧めしません。X
とY
から異なる行を削除すると、データラベルの不一致が発生する可能性があるためです。
最後に、分類子を分割して呼び出します。
X_train, X_test, y_train, y_test = train_test_split(X, Y, random_state=0)
clf = LinearRegression().fit(X_train, y_train)
線形回帰の動作がはるかに良くなるよりも、ラベルエンコーディングまたは1つのホットエンコーディングを使用して、すべての文字列列をbinary(0,1)に変換する方が良いと思います。