当前位置: 首页 > 知识库问答 >
问题:

DictVectorizer问题:为不同的输入创建不同数量的特性

高慈
2023-03-14

我试图写一个机器学习算法,我试图预测输出是+50000还是-50000。在这样做时,我利用了11个字符串特征使用随机森林分类器。但是由于随机森林分类器需要以float/numbers的形式输入,所以我使用DictVectorizer将字符串特性转换为float/numbers。但是对于数据中的不同行,DictVectorizer创建了不同数量的特性(240-260)。这会导致预测模型输出的错误。一个示例输入行是:

{'detailed household summary in household': ' Spouse of householder',
 'tax filer stat': ' Joint both under 65',
 'weeks worked in year': ' 52',
 'age': '32', 
 'sex': ' Female',
 'marital status': ' Married-civilian spouse present',
 'full or part time employment stat': ' Full-time schedules',
 'detailed household and family stat': ' Spouse of householder', 
 'education': ' Bachelors degree(BA AB BS)',
 'num persons worked for employer': ' 3',
 'major occupation code': ' Adm support including clerical'}

是否有一些方法我可以转换输入,以便我可以使用随机森林分类器预测输出。

编辑:我使用的代码是:

    X,Y=[],[]
    features=[0,4,7,9,12,15,19,22,23,30,39]
    with open("census_income_learn.csv","r") as fl:
        reader=csv.reader(fl)
        for row in reader:
            data={}
            for i in features:
                data[columnNames[i]]=str(row[i])
            X.append(data)
            Y.append(str(row[41]))

    X_train, X_validate, Y_train, Y_validateActual = train_test_split(X, Y, test_size=0.2, random_state=32)

    vec = DictVectorizer()
    X_train=vec.fit_transform(X_train).toarray()
    X_validate=vec.fit_transform(X_validate).toarray()
    print("data ready")

    forest = RandomForestClassifier(n_estimators = 100)
    forest = forest.fit( X_train, Y_train )
    print("model created")

    Y_predicted=forest.predict(X_validate)
    print(Y_predicted)

所以在这里,如果我试图打印训练集和验证集的第一个元素,我在x_train[0]中得到252个特性,而在x_validate[0]中有249个特性。

共有1个答案

孔俊爽
2023-03-14

试试这个:

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

cols = [0,4,7,9,12,15,19,22,23,30,39,  41]
names = [
 'detailed household summary in household',
 'sex',
 'full or part time employment stat',
 'age',
 'detailed household and family stat',
 'weeks worked in year',
 'num persons worked for employer',
 'major occupation code',
 'tax filer stat',
 'education',
 'marital status',
 'TARGET'
]

fn = r'D:\temp\.data\census_income_learn.csv'
data = pd.read_csv(fn, header=None, usecols=cols, names=names)

# http://stackoverflow.com/questions/24458645/label-encoding-across-multiple-columns-in-scikit-learn    
df = data.apply(LabelEncoder().fit_transform)

X, Y = np.split(df, [11], axis=1)
X_train, X_validate, Y_train, Y_validateActual = train_test_split(X, Y, test_size=0.2, random_state=32)

forest = RandomForestClassifier(n_estimators = 100)
forest = forest.fit( X_train, Y_train )

Y_predicted=forest.predict(X_validate)
 类似资料:
  • 对于下面的代码,我得到了不同的输出 输出为: 现在美国/洛杉矶是GMT-8/UTC-8或PST。但当我将参数从GMT-8改为America/Los_Angeles时, 输出为: 不能使用类似PST的缩写,因为它已被弃用。同时,CST可以指中央标准时间和中国标准时间。 我的输入是-8、-9-14等,我希望在GMT/UTC之前知道我是否可以在给定日期获得DST激活。 请在这方面指导我。

  • 想象一下下面的scanario:我有一个程序,它要求输入一个整数,然后是一个String输入。 根据aobe代码,我没有机会输入姓名。因此,通常我会声明2个扫描仪对象,如下所示: 我的问题是:有必要声明多个扫描仪对象来接受不同类型的输入吗??我这样做是正确的吗? 我已经考虑这个问题很多年了。(SO中的几个问题提到了多扫描仪,但他们的问题只使用了一个扫描仪对象,所以我今天问这个问题。)

  • 我试图在Worker中创建ImageData,只需将带有图像URL、宽度和高度的消息发布到Worker中。为了让它工作,我需要获取图像并获取ArrayBuffer。这样我就可以创建新的ImageData: 我得到以下错误:输入数据字节长度不是(4*宽度)的倍数。 对于Chrome,我能够向Worker发布的不仅仅是URL,还有之前使用canvas在主线程中创建的整个ArrayBuffer,这很有效

  • 我正在使用Gradle构建系统在Android Studio上编写一个具有多种风格的应用程序。主应用程序/AndroidManifest文件有自己定义的启动程序活动,我想用Flavor/AndroidManifest文件覆盖它,我在其中定义了其他启动程序活动,这些活动只是Flavor/source代码的一部分。 编辑:以下是文件层次结构: 应用程序名称- src公司- 但当我这样做时,它给出了一个

  • 问题内容: 我正在使用具有Spring安全性的BCryptPasswordEncoder。我的期望是,对于相同的输入,我将始终获得相同的输出。但是对于相同的输入,我得到不同的输出。您可以使用以下代码段对其进行测试: 输出:$ 2a $ 10 $ cYLM.qoXpeAzcZhJ3oXRLu9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi 输出2:$ 2a $ 10 $ KEvYX9y

  • 我读取一个简单的JSON字符串作为输入,并基于两个字段和对流进行键控。但是KeyBy为的不同值生成相同的键控流,但为和的特定组合生成相同的键控流。 输入: 这是我的Flink代码的核心逻辑: