构建评分预测分类器时,如何将两列作为自变量纳入分析
如何结合pricerange与pricecurrency作为分类器的自变量
一、先搞定基础数据类型转换
你的示例里pricerange、ratingvalue都是字符串格式,pricecurrency还混了数字和字符串,先统一转成模型能处理的规范类型:
import pandas as pd df = pd.DataFrame({ 'ratingvalue': ['5.0', '4.5', '2.0'], 'pricerange': ['10000000', '899', '200'], 'pricecurrency': ['45', '15', '20'] }) # 转换数据类型 df['ratingvalue'] = df['ratingvalue'].astype(float) df['pricerange'] = df['pricerange'].astype(int) df['pricecurrency'] = df['pricecurrency'].astype(str) # 统一为字符串,避免混合类型问题
二、最优方案:把价格转成统一货币金额
不同货币的购买力天差地别,最合理的做法是将所有pricerange转换成同一种基准货币(比如USD)的实际价值,这样模型能直接用这个统一数值作为核心特征。
你需要先准备货币代码到汇率的映射(比如你说的45对应EUR、15对应USD,自己补充完整的汇率表):
# 示例:以USD为基准的汇率映射(1单位对应货币 = X USD) currency_exchange = { '15': 1.0, # USD本身 '45': 1.09, # EUR,假设1 EUR兑换1.09 USD '20': 0.0074 # 比如JPY,1 JPY兑换0.0074 USD } # 计算统一货币后的价格 df['normalized_price'] = df.apply( lambda row: row['pricerange'] / currency_exchange[row['pricecurrency']], axis=1 )
生成的normalized_price已经融合了原始价格和货币的影响,可以直接作为模型的自变量。
三、没有汇率数据时的替代方法
如果拿不到准确汇率,试试这两种方式:
1. 做交互特征
先把pricerange归一化(避免数值差距太大),再和货币编码相乘生成交互特征,同时保留货币本身的类别特征:
from sklearn.preprocessing import MinMaxScaler # 归一化pricerange到0-1区间 scaler = MinMaxScaler() df['pricerange_scaled'] = scaler.fit_transform(df[['pricerange']]) # 货币转成数值编码,生成交互特征 df['currency_code'] = df['pricecurrency'].astype(int) df['price_currency_interact'] = df['pricerange_scaled'] * df['currency_code']
之后可以把price_currency_interact和pricecurrency(作为类别)一起喂给模型。
2. 按货币分组做价格分箱
把同一货币下的价格分成低、中、高几个区间,生成类别特征:
# 按货币分组,对价格做三分位分箱 df['price_bucket'] = df.groupby('pricecurrency')['pricerange'].transform( lambda x: pd.qcut(x, q=3, labels=['low', 'medium', 'high']) )
这个price_bucket能体现同货币下的价格档位,再搭配pricecurrency一起编码后输入模型。
四、最后整理成模型可用的特征
- 数值特征(比如
normalized_price)直接用就行 - 类别特征(比如
pricecurrency、price_bucket)需要做编码,比如独热编码(适合线性模型)或者直接留原编码(适合树模型)
示例独热编码处理:
# 对类别特征做独热编码,drop_first避免多重共线性 encoded_cats = pd.get_dummies(df[['pricecurrency', 'price_bucket']], drop_first=True) # 合并所有特征 final_features = pd.concat([df[['normalized_price']], encoded_cats], axis=1)
之后就用final_features当自变量,ratingvalue(如果是分类任务要先转成类别,比如高/中/低评分)当因变量训练分类器就行。
内容的提问来源于stack exchange,提问作者YC Tseng
相关产品推荐
相关产品推荐

