我开始使用scikit-learn做一些NLP.我已经使用了NLTK的一些分类器,现在我想尝试在scikit-learn中实现的分类器.
我的数据基本上是句子,我从这些句子的某些单词中提取特征来做一些分类任务.我的大多数功能都是名义上的:单词的词性(POS),左到右的单词,左到右的单词,右到右的单词,POS单词到单词. - 正确的,句法关系从一个词到另一个词的路径等.
当我使用NLTK分类器(决策树,朴素贝叶斯)进行一些实验时,特征集只是一个字典,其中包含特征的相应值:标称值.例如:[{"postag":"noun","wleft":"house","path":"VPNPNP",...},....].我只需将其传递给分类器,他们就完成了自己的工作.
这是使用的代码的一部分:
def train_classifier(self):
if self.reader == None:
raise ValueError("No reader was provided for accessing training instances.")
# Get the argument candidates
argcands = self.get_argcands(self.reader)
# Extract the necessary features from the argument candidates
training_argcands = []
for argcand in argcands:
if argcand["info"]["label"] == "NULL":
training_argcands.append( (self.extract_features(argcand), "NULL") )
else:
training_argcands.append( (self.extract_features(argcand), "ARG") )
# Train the appropriate supervised model
self.classifier = DecisionTreeClassifier.train(training_argcands)
return
Run Code Online (Sandbox Code Playgroud)
以下是提取的一个功能集的示例:
[({'phrase': u'np', 'punct_right': 'NULL', 'phrase_left-sibling': 'NULL', 'subcat': 'fcl=np np vp np …Run Code Online (Sandbox Code Playgroud) python text-processing classification scikit-learn feature-engineering
在随机森林的Mllib版本中,可以用参数指定具有名义特征(数字但仍为分类变量)categoricalFeaturesInfo
的列ML随机森林有什么用?在用户指南中,有一个使用VectorIndexer 的示例,该示例也可以转换vector中的分类特征,但是它写为“自动识别分类特征并对其进行索引”
在关于同一问题的其他讨论中,我发现在随机森林中无论如何数字索引都被视为连续特征,建议进行一次热编码以避免这种情况,在这种算法的情况下似乎没有意义,并且特别是考虑到上述官方示例!
我还注意到,当分类列中有很多类别(> 1000)时,一旦用StringIndexer对其进行了索引,随机森林算法就会要求我设置MaxBin参数,该参数应该与连续功能一起使用。这是否意味着如官方示例中所指定的那样,将要将超过箱数的特征视为连续特征,因此对于我的分类列,StringIndexer是可以的,还是意味着整个具有数字标称特征的列都将是假设变量是连续的,进行分类?
random-forest apache-spark apache-spark-ml apache-spark-mllib feature-engineering
时间相关数据我最初的格式为整数:
1234 # corresponds to 12:34
2359 # corresponds to 23:59
Run Code Online (Sandbox Code Playgroud)
1)第一个选项是将时间描述为numeric_column:
tf.feature_column.numeric_column(key="start_time", dtype=tf.int32)
Run Code Online (Sandbox Code Playgroud)
2)另一种选择是将时间分成几小时和几分钟分成两个独立的特征列:
tf.feature_column.numeric_column(key="start_time_hours", dtype=tf.int32)
tf.feature_column.numeric_column(key="start_time_minutes", dtype=tf.int32)
Run Code Online (Sandbox Code Playgroud)
3)第三个选项是维护一个特征列,但让tensorflow知道它可以在分成小时和分钟时进行描述:
tf.feature_column.numeric_column(key="start_time", shape=2, dtype=tf.int32)
Run Code Online (Sandbox Code Playgroud)
这种分裂是否有意义,选项2)和3)之间有什么区别?
另外一个问题,我遇到了如何从csv解码矢量数据的问题:
1|1|FGTR|1|1|14,2|15,1|329|3|10|2013
1|1|LKJG|1|1|7,2|19,2|479|7|10|2013
1|1|LKJH|1|1|14,2|22,2|500|3|10|2013
Run Code Online (Sandbox Code Playgroud)
如何让tensorflow知道"14,2","15,1"应该被视为张量形状= 2?
编辑1:
我找到了解码来解码来自csv的"数组"数据的解决方案.在训练和评估函数中,我添加.map了一些步骤来解码某些列的数据:
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels)).map(parse_csv)
Run Code Online (Sandbox Code Playgroud)
parse_csv实现为:
def parse_csv(features, label):
features['start_time'] = tf.string_to_number(tf.string_split([features['start_time']], delimiter=',').values, tf.int32)
return features, label
Run Code Online (Sandbox Code Playgroud)
我认为两个分离的列和一个列之间的区别在于shape=2"权重"的分布方式.
我有一个数据框
Date repair
<date> <dbl>
2018-07-01 4420
2018-07-02 NA
2018-07-03 NA
2018-07-04 NA
2018-07-05 NA
Run Code Online (Sandbox Code Playgroud)
其中4420是时间,以分钟为单位。我试图得到这个:
Date repair
<date> <dbl>
2018-07-01 1440
2018-07-02 1440
2018-07-03 1440
2018-07-04 100
2018-07-05 NA
Run Code Online (Sandbox Code Playgroud)
一天中有1440分钟-剩下100分钟。我做到了循环。能否以更优雅的方式实现?
我有一个数据框,想使用 featuretools 进行自动特征工程部分。我可以使用规范化实体功能来做到这一点。代码片段如下:
es = ft.EntitySet(id = 'obs_data')
es = es.entity_from_dataframe(entity_id = 'obs', dataframe = X_train,
variable_types = variable_types, make_index = True, index = "Id")
for feat in interaction: # interaction columns are found using xgbfir
es = es.normalize_entity(base_entity_id='obs', new_entity_id=feat, index=feat)
features, feature_names = ft.dfs(entityset = es,
target_entity = 'obs',
max_depth = 2)
Run Code Online (Sandbox Code Playgroud)
它的创建功能,现在我想为 X_test 做同样的事情。我阅读了有关此的博客,他们建议将 X_train 和 X_test 结合起来,然后执行相同的过程。假设 X_test 中有 5 个 obs,如果我将它与 X_train 结合起来,那么每个观察(来自 X_test)也会对其他 4 个观察(X_test)产生影响,这不是一个好主意。任何人都可以建议如何使用新数据的特征工具进行特征工程?
我有一个 csv 文件,其中包含一些属性,其中之一是不同餐厅的星级评级etoiles(法语中的“星级”)。这里annee指的是评级的年份。
注意:我不知道如何在这里共享 Jupyter 笔记本表输出,我尝试了不同的命令行,但格式总是很难看。如果有人能帮忙的话。
我想做的非常简单(我认为)..我想添加一个新列,表示餐厅每年星级平均值的标准差。所以我必须估计每年的平均星级。然后,计算这些值的标准差。但是,我真的不知道使用 pandas 的语法可以让我计算餐厅每年的平均星级。有什么建议么?
我知道我需要按年份对餐厅进行分组.groupby('restaurant_id')['annee'],然后取该年餐厅星级的平均值,但我不知道如何写。
# does not work
avis['newColumn'] = (
avis.groupby(['restaurant_id', 'annee'])['etoiles'].mean().std()
)
Run Code Online (Sandbox Code Playgroud) 我有一个简单的 FastApi 端点,它使用 SqlAlchemy 连接到 MySQL 数据库(基于教程: https: //fastapi.tiangolo.com/tutorial/sql-databases/)
我使用以下命令创建会话:
engine = create_engine(
SQLALCHEMY_DATABASE_URL
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Run Code Online (Sandbox Code Playgroud)
我创建依赖项:
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
Run Code Online (Sandbox Code Playgroud)
在我的路线中,我想执行任意 SQL 语句,但我不确定如何正确处理会话、连接、游标等(包括关闭),我通过艰难的方式了解到这对于正确的性能非常重要
@app.get("/get_data")
def get_data(db: Session = Depends(get_db)):
???
Run Code Online (Sandbox Code Playgroud)
最终的原因是我的表包含机器学习功能,其中的列事先未确定。如果有一种方法可以定义带有“所有列”的基本模型,也可以,但我也找不到。
我的二手车价格预测数据集中有一列名为“Owner_Type”的列。它有四个唯一值,即['第一'、'第二'、'第三'、'第四']。现在,最有意义的顺序是第一>第二>第三>第四,因为价格相对于该顺序下降。如何使用 OrdinalEncoder() 为值指定此顺序?请帮助我,谢谢!
python machine-learning categorical-data feature-engineering
在我的功能工程期间,发生了以下错误。我的功能列表有 21 个子列表,每个 8537 个值是 0 或 1。当尝试通过 tensorflow 运行 One Hot Encoding 时,它显示错误Could not find valid device for node
有没有人有快速修复错误的方法?
for feature in featurelist[1:]:
df = tensorflow.convert_to_tensor(feature, dtype=tensorflow.float32)
print(df)
df_enc = tensorflow.one_hot(df, 2, on_value=None, off_value=None, axis=None, dtype=None, name=None)
print(df_enc)
Run Code Online (Sandbox Code Playgroud)
2020-05-29 15:08:41.969878: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fdefbc23d50 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-05-29 15:08:41.969919: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version
tf.Tensor([0. 0. 0. ... 0. 0. 0.], shape=(8537,), …Run Code Online (Sandbox Code Playgroud) python keras tensorflow one-hot-encoding feature-engineering
我有一个代表餐厅顾客评分的数据框。star_rating是该数据框中客户的评级。
nb_fave_rating在同一数据框中添加一列,表示餐厅的好评总数。如果其星星数为 ,我认为“赞成”意见> = 3。data = {'rating_id': ['1', '2','3','4','5','6','7','8','9'],
'user_id': ['56', '13','56','99','99','13','12','88','45'],
'restaurant_id': ['xxx', 'xxx','yyy','yyy','xxx','zzz','zzz','eee','eee'],
'star_rating': ['2.3', '3.7','1.2','5.0','1.0','3.2','1.0','2.2','0.2'],
'rating_year': ['2012','2012','2020','2001','2020','2015','2000','2003','2004'],
'first_year': ['2012', '2012','2001','2001','2012','2000','2000','2001','2001'],
'last_year': ['2020', '2020','2020','2020','2020','2015','2015','2020','2020'],
}
df = pd.DataFrame (data, columns = ['rating_id','user_id','restaurant_id','star_rating','rating_year','first_year','last_year'])
df['star_rating'] = df['star_rating'].astype(float)
positive_reviews = df[df.star_rating >= 3.0 ].groupby('restaurant_id')
positive_reviews.head()
Run Code Online (Sandbox Code Playgroud)
从这里开始,我不知道要计算餐厅的正面评论数量并将其添加到我的初始数据框的新列中df。
预期的输出会是这样的。
data = {'rating_id': ['1', '2','3','4','5','6','7','8','9'],
'user_id': ['56', '13','56','99','99','13','12','88','45'],
'restaurant_id': ['xxx', 'xxx','yyy','yyy','xxx','zzz','zzz','eee','eee'],
'star_rating': ['2.3', '3.7','1.2','5.0','1.0','3.2','1.0','2.2','0.2'],
'rating_year': ['2012','2012','2020','2001','2020','2015','2000','2003','2004'],
'first_year': ['2012', '2012','2001','2001','2012','2000','2000','2001','2001'],
'last_year': ['2020', '2020','2020','2020','2020','2015','2015','2020','2020'],
'nb_fave_rating': ['1', …Run Code Online (Sandbox Code Playgroud) python ×6
pandas ×2
tensorflow ×2
apache-spark ×1
dataframe ×1
dplyr ×1
fastapi ×1
featuretools ×1
keras ×1
r ×1
scikit-learn ×1
sqlalchemy ×1
tidyverse ×1