我在进行Python与R的速度比较测试时遇到了问题,具体是关于sklearn中使用分类变量进行LinearRegression的操作。
R语言代码:
# 启动计时器!ptm <- proc.time()ptmtest_data = read.csv("clean_hold.out.csv")# 回归模型model_liner = lm(test_data$HH_F ~ ., data = test_data)# 停止计时器new_ptm <- proc.time() - ptm
Python代码:
import pandas as pdimport timefrom sklearn.linear_model import LinearRegressionfrom sklearn.feature_extraction import DictVectorizerstart = time.time()test_data = pd.read_csv("./clean_hold.out.csv")x_train = [col for col in test_data.columns[1:] if col != 'HH_F']y_train = ['HH_F']model_linear = LinearRegression(normalize=False)model_linear.fit(test_data[x_train], test_data[y_train])
但对我来说这是行不通的
return X.astype(np.float32 if X.dtype == np.int32 else np.float64) ValueError: 无法将字符串转换为浮点数: Bee True
我尝试了另一种方法
test_data = pd.read_csv("./clean_hold.out.csv").to_dict()v = DictVectorizer(sparse=False)X = v.fit_transform(test_data)
然而,我遇到了另一个错误:
File “C:\Anaconda32\lib\site-packages\sklearn\feature_extraction\dict_vectorizer.py”, line 258, in transform Xa[i, vocab[f]] = dtype(v) TypeError: float() 参数必须是字符串或数字
我不明白Python应该如何解决这些问题…
数据示例:http://screencast.com/t/hYyyu7nU9hQm
回答:
在使用fit
之前,我需要进行一些编码操作。
可以使用以下几种类:
LabelEncoder : 将你的字符串转换为递增值OneHotEncoder : 使用One-of-K算法将你的字符串转换为整数
我希望有一个可扩展的解决方案,但没有得到任何答案。我选择了OneHotEncoder,它将所有字符串二值化。这种方法相当有效,但如果你有很多不同的字符串,矩阵会迅速增长,需要更多的内存。