Python scikit学习转换多个文本功能

Python scikit学习转换多个文本功能,python,scikit-learn,svm,Python,Scikit Learn,Svm,我正在尝试将多个文本功能分类为一种状态。数据包括来自不同服务器和组件的消息(错误和警告),并将导致不同的状态。例如: ServerName Name Description Severity State -------------- -------- ----------------------------------------- ---------- ------------- QWERT-XY-123 My

我正在尝试将多个文本功能分类为一种状态。数据包括来自不同服务器和组件的消息(错误和警告),并将导致不同的状态。例如:

ServerName     Name     Description                               Severity   State
-------------- -------- ----------------------------------------- ---------- -------------
QWERT-XY-123   MySQL    Service not available on target machine   error      important
QWERT-XY-146   Oracle   Service caused an error                   warning    unimportant
...    
这是矢量化的一部分:

来自sklearn.feature\u extraction.text导入哈希向量器
矢量器=哈希矢量器()
X_Servername=df[“Servername”]。值
X_Name=df[“Name”]。值
X_Description=df[“Description”]。值
X_严重性=df[“严重性”]。数值
y=df[“状态”]。值
X_Servername=vectorizer.transform(X_Servername)
X_Name=矢量器.transform(X_Name)
X_Description=矢量器.transform(X_Description)
功能=列表(zip(X_服务器名、X_名称、X_描述、X_严重性))
现在,我想适合模型:

从sklearn.svm导入SVC
模型=SVC(内核=“线性”,概率=真)
模型拟合(特征,y)
结果是以下错误:

---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
2.
3模型=SVC(内核=“线性”,概率=真)
---->4.模型配合(特征,y)
5.
6#打印(模型分数(X#U测试,y))
D:\Environment\Anaconda3\lib\site packages\sklearn\svm\base.py适合(自身、X、y、样本重量)
147 self.\u sparse=稀疏且不可调用(self.kernel)
148
149-->X,y=check_X_y(X,y,dtype=np.float64,order='C',accept_sparse='csr')
150 y=自我验证目标(y)
151
D:\environment\Anaconda3\lib\site packages\sklearn\utils\validation.py in check\u X\u y(X,y,accept\u sparse,dtype,order,copy,force\u all\u finite,sure\u 2d,allow\u nd,multi\u output,sure\u minu samples,sure\u minu特征,y\u numeric,warn\u on\u dtype,estimator)
571 X=检查数组(X,接受稀疏,数据类型,顺序,复制,强制所有有限,
572确保2d,允许nd,确保最小样本,
573-->确保最低功能,警告数据类型,估计器)
574如果多输出:
575 y=检查数组(y,'csr',强制所有有限=真,确保2d=假,
检查数组中的D:\environment\Anaconda3\lib\site packages\sklearn\utils\validation.py(数组、接受稀疏、数据类型、顺序、复制、强制所有有限、确保2d、允许nd、确保最小样本、确保最小特征、警告数据类型、估算器)
431力(所有有限)
432其他:
433-->数组=np.数组(数组,数据类型=数据类型,顺序=顺序,副本=副本)
434
435如果确保_2d:
ValueError:使用序列设置数组元素。
所以我的问题是关于如何在hashingvectorizer中使用多个特性,还是将所有特性放在一行中的唯一方法

谢谢你的帮助

更新 失败的关键在于如何构建矢量化功能列表。而不是:

features=list(zip(X_Servername,X_Name,X_Description,X_Severity))
我现在使用这个函数,其中
提取的
附加所有创建的矢量化值(X_ServerName,X_Name,…):


请尝试以下代码:

from sklearn_pandas import DataFrameMapper, gen_features
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.preprocessing import LabelEncoder

cat_features = ["ServerName", "Name", "Description", "Severity"]
gf = gen_features(cat_features, [HashingVectorizer])
mapper = DataFrameMapper(gf)
cat_features_transformed = mapper.fit_transform(df)

target_name_encoded = LabelEncoder().fit_transform(df["State"])

from sklearn.svm import SVC

model = SVC(kernel = "linear", probability=True)
model.fit(cat_features_transformed, target_name_encoded)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
  kernel='linear', max_iter=-1, probability=True, random_state=None,
  shrinking=True, tol=0.001, verbose=False)

### For test/prediction part ###

test_features_transformed = mapper.transform(df_test)
predictions = model.predict(test_features_transformed)
注意,您可能需要运行

pip install sklearn-pandas
如果您的机器上没有安装
skp

上述解决方案将允许您(1)将数据转换为合适的格式,然后(2)通过
transform
方法对测试数据应用相同的拟合转换


请让我们知道这是否有帮助,请尝试以下代码:

from sklearn_pandas import DataFrameMapper, gen_features
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.preprocessing import LabelEncoder

cat_features = ["ServerName", "Name", "Description", "Severity"]
gf = gen_features(cat_features, [HashingVectorizer])
mapper = DataFrameMapper(gf)
cat_features_transformed = mapper.fit_transform(df)

target_name_encoded = LabelEncoder().fit_transform(df["State"])

from sklearn.svm import SVC

model = SVC(kernel = "linear", probability=True)
model.fit(cat_features_transformed, target_name_encoded)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
  kernel='linear', max_iter=-1, probability=True, random_state=None,
  shrinking=True, tol=0.001, verbose=False)

### For test/prediction part ###

test_features_transformed = mapper.transform(df_test)
predictions = model.predict(test_features_transformed)
注意,您可能需要运行

pip install sklearn-pandas
如果您的机器上没有安装
skp

上述解决方案将允许您(1)将数据转换为合适的格式,然后(2)通过
transform
方法对测试数据应用相同的拟合转换


请让我们知道这是否有帮助

在您尝试转换数据之前,您从未
安装
矢量器。我猜您的输出不是您在尝试安装SVCHi@G.Anderson之前所认为的。谢谢您的回复。I
fit
使用
fit\u transform
调整矢量器,但仍然存在相同的错误,在尝试转换数据之前,您从未
fit
调整矢量器。我猜您的输出不是您在尝试安装SVCHi@G.Anderson之前所认为的。谢谢您的回复。I
fit
带有
fit_transform
的矢量器,但仍然存在相同的错误可能重复使用sklearn pandas构建基于列变换器或特征联合的解决方案并将其合并到管道中是否有优势?似乎解决了我的问题。模型可以是
fit
。明天我将测试它:-)@KRKirov
DataFrameMapper
ColumnTransformer
基本相同,使用
genu功能的代码是knitter。但是,通过显式地编写转换序列,您总是可以实现同样的效果。@SergeyBushmanov,感谢您的回复。请原谅我这么说,但我发现基于SKL的解决方案有点不整洁。使用标准的sklearn transformers阅读基于管道的解决方案可能会更容易。使用sklearn transformers构建基于列转换器或功能联合的解决方案并将其合并到管道中是否有优势?似乎解决了我的问题。模型可以是
fit
。明天我将测试它:-)@KRKirov
DataFrameMapper
ColumnTransformer
基本相同,使用
genu功能的代码是knitter。但是,通过显式地编写转换序列,您总是可以实现同样的效果。@SergeyBushmanov,感谢您的回复。请原谅我这么说,但我发现基于SKL的解决方案有点不整洁。使用标准的sklearn transformers,阅读基于管道的解决方案可能会更容易。