我有一个超过 10 列的 CSV 文件,其中一些列有分类数据,一些分类列只有yes
和no
值,一些列有颜色(green
, blue
, red
...),一些列有其他字符串值。
有没有办法用所有列制作回归模型?
我知道yes
和no
值可以表示为 1 和 0,但我读过用数字表示颜色名称或城市名称不好。有没有更好/正确的方法来做到这一点?
这是带有虚拟数据的简单代码:
import pandas as pd
from sklearn.linear_model import LinearRegression
df = pd.DataFrame({'par1':[1,3,5,7,9, 11,13],
'par2':[0.2, 0.4, 0.5, 0.7, 1, 1.2, 1.45],
'par3':['yes', 'no', 'no', 'yes', 'no', 'yes', 'no'],
'par4':['blue', 'red', 'red', 'blue', 'green', 'green', 'blue'],
'output':[103, 310, 522, 711, 921, 1241, 1451]})
print(df)
features = df.iloc[:,:-1]
result = df.iloc[:,-1]
reg = LinearRegression()
model = reg.fit(features, result)
prediction = model.predict([[2, 0.33, 'no', 'red']])
reg_score = reg.score(features, result)
print(prediction, reg_score)
在我使用的真实数据集中,这些字符串值对数据集非常重要,所以我不能只删除该列
您还需要“标准化”数值变量。
Scikit-learn 让这一切变得简单:
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
t = ColumnTransformer(transformers=[
('onehot', OneHotEncoder(), ['par3', 'par4']),
('scale', StandardScaler(), ['par1', 'par2'])
], remainder='passthrough') # Default is to drop untransformed columns
t.fit_transform(df)
最后,在通过模型运行之前,您需要以相同的方式转换输入。
将所有这些放在一起,您将得到:
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
df = pd.DataFrame({'par1':[1,3,5,7,9, 11,13],
'par2':[0.2, 0.4, 0.5, 0.7, 1, 1.2, 1.45],
'par3':['yes', 'no', 'no', 'yes', 'no', 'yes', 'no'],
'par4':['blue', 'red', 'red', 'blue', 'green', 'green', 'blue'],
'output':[103, 310, 522, 711, 921, 1241, 1451]})
t = ColumnTransformer(transformers=[
('onehot', OneHotEncoder(), ['par3', 'par4']),
('scale', StandardScaler(), ['par1', 'par2'])
], remainder='passthrough')
# Transform the features
features = t.fit_transform(df.iloc[:,:-1])
result = df.iloc[:,-1]
# Train the linear regression model
reg = LinearRegression()
model = reg.fit(features, result)
# Generate a prediction
example = t.transform(pd.DataFrame([{
'par1': 2, 'par2': 0.33, 'par3': 'no', 'par4': 'red'
}]))
prediction = model.predict(example)
reg_score = reg.score(features, result)
print(prediction, reg_score)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句