一直以来,人工智能(AI)在各个领域都表现出了强悍的水准。在学习中,我觉得机器学习具备巨大的潜力。近期接触了一个风险控制项目,务必涉及机器学习行业。因而,我就依据学习了解了机器学习领域的知识。本文将剖析机器学习在项目中的运用以及通过近期的项目分享一些经验。欢迎讨论~
背景介绍
本项目的初衷是解决传统风险控制的一些缺陷。比如,传统方法一般采用系统及静态模型进行实时监控和预测,无法适应灵便的使用场景;此外,处理规模性数据的效率很低,无法提供精确的风险评估和投资决策。基于数据发掘算法,融合了机器学习的特征,基本解决了这些问题。
为了读者能更好地理解项目以及还有些刚触及AI领域的伙伴能够了解背景,我就简单解释一些机器学习的基础概念,大致就是使得计算机拥有自我学习能力,可以从提供的数据中发现一些规律和固定的模式,计算机拥有这些基础的数据规律后,就运用这些数据规律做出决策或者预测。看到这里就知晓了,机器学习就是让计算机通过学习数据中的规律,然后对未知的数据进行预测或决策,这就是机器学习~下面我们进入项目。
项目细节
数据收集与预处理
如同上面所说,机器学习需要提供一些数据才能进行后续操作。那么首要任务就是收集解决数据。数据采集和预处理就是是磨刀不误砍柴工的关键一步。我们提供的数据品质高,才能得出更精准的结果,无论我们做什么项目。本文从风险控制为例进行项目的讨论。
我们从网络收集了一些交易数据,市场数据和其它相关的数据并进行一些清洗去除重复数据、处理缺失值等工作,这些工作虽然枯燥乏味,但是也是不能省略的,提供的数据质量较低会直接导致机器学习的失败。下面我展示数据清洗部分代码。
# 数据清洗
transaction_data = transaction_data.drop_duplicates()#去重
market_data = market_data.dropna() #去除缺失值
economic_indicators = economic_indicators.fillna(0) #缺失值填充为0
#数据格式化,以日期作为索引
transaction_data['Date'] = pd.to_datetime(transaction_data['Date'])
transaction_data = transaction_data.set_index('Date')
market_data['Date'] = pd.to_datetime(market_data['Date'])
market_data = market_data.set_index('Date')
economic_indicators['Date'] = pd.to_datetime(economic_indicators['Date'])
economic_indicators = economic_indicators.set_index('Date')
注意,这里我使用了函数将日期列转换为日期类型,并设置成了索引,方便后续操作。这里大家也可以根据自己的情况进行其他数据的格式化与标准化,比如说单位的转换,数据归一化等操作,都是需要注意的细节。
特征工程
1.特征提取
特征提取是需要根据业务的需求选择特征,比如均值、标准差、时间序列、市场指标等等。我们需要提取一些统计特征,时间计算等特征,如下:
#均值
mean_feature = np.mean(data)
#标准差
std_feature = np.std(data)
#最大值
max_feature = np.max(data)
#最小值
min_feature = np.min(data)
#中位数
median_feature = np.median(data)
时间序列特征:包括趋势、周期性等。可以使用滑动窗口或指数加权移动平均等方法来提取这些特征。
import pandas as pd
#趋势特征:斜率
def calculate_trend(data):
x = np.arange(len(data))
slope, _, _, _, _ = linregress(x, data)
return slope
#傅里叶变换
def calculate_periodicity(data):
fft = np.fft.fft(data)
freqs = np.fft.fftfreq(len(data))
idx = np.argmax(np.abs(fft))
freq = freqs[idx]
return abs(freq)
#滑动窗口计算特征
window_size = 10
rolling_mean = pd.Series(data).rolling(window=window_size).mean()
#使用指数加权移动平均计算特征
ewm_mean = pd.Series(data).ewm(span=window_size).mean()
2.市场指标
RSI(相对强弱指标)、MACD(移动平均收敛/发散指标)等。这些指标我们通过计算价格和成交量的变化就能得到。这里给出MACD指标代码。
def calculate_macd(data, short_window=12, long_window=26):
ema_short = pd.Series(data).ewm(span=short_window).mean()
ema_long = pd.Series(data).ewm(span=long_window).mean()
macd = ema_short - ema_long
return macd
3.特征转换和编码
对于连续型特征,可以进行归一化或标准化处理,使其具有相同的尺度范围。
#归一化
scaler = MinMaxScaler()
normalized_data = scaler.fit_transform(data.reshape(-1, 1))
#标准化
scaler = StandardScaler()
standardized_data = scaler.fit_transform(data.reshape(-1, 1))
对于离散型特征,可以进行独热编码,将其转化为二进制形式的向量。
from sklearn.preprocessing import OneHotEncoder
# 独热编码
encoder = OneHotEncoder()
encoded_data = encoder.fit_transform(data.reshape(-1, 1)).toarray()
模型选择与训练
选择机器学习模型,我使用的是支持向量机(SVM),SVM是一种常用的监督学习模型,一般用于分类和回归任务。这里用它及逆行训练并评估。
#创建并训练SVM模型
svm_model = SVC()
svm_model.fit(X_train, y_train)
#在测试集上进行预测
y_pred = svm_model.predict(X_test)
#评估模型性能
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
我认为在训练的过程中,最好使用不同的超参数设置,比如SVM模型的和函数,正则化参数C等等,通过交叉验证的方法进行参数调优,就能获得更好的模型性能~
实时监测与预测
我使用了Apache Kafka和scikit-learn库来实现实时监测和预测。首先,要确保已经安装好了Apache Kafka和scikit-learn库,并完成配置,教程也很多,一搜就有。应用比较简单,但是使用中还要注意异常的处理,数据流量的控制等等,流式处理也还有其它选择,Apache Flink、Apache Storm等都可以。
from sklearn.externals import joblibfrom kafka import KafkaConsumer, KafkaProducer
#加载模型
model = joblib.load('svm_model.pkl')
#创建Kafka消费者和生产者
consumer=KafkaConsumer('input_topic', bootstrap_servers='localhost:9092')
producer = KafkaProducer(bootstrap_servers='localhost:9092')
#实时监测和预测
for msg in consumer:
# 解析接收到的消息
data = msg.value
# 在此处进行特征提取和预处理
# 进行预测
prediction = model.predict(data)
# 发送预测结果到输出主题
producer.send('output_topic', str(prediction).encode('utf-8'))
风险评价与决策分析
这个是风控项目中比较重要的环节,需要根据机器学习模型预测的结果和其它指标进行风险的评估,最好给出决策支持。本项目我将风险等级划分了低、中、高三个级别,通过风险苹果结果提供一些决策支持,代码也比较简单,就不陈列了,比如说可以用简单的循环就能便利每一条数据,并根据风险等级输出相应的建议或提示信息。
一个简单的项目中也存在着机器学习的真谛。经过项目的初步实现,我对机器学习有了新的认识,涉及到特征工程、模型选择和训练等,都是机器学习行业的重要内容,同时我对数据处理的格式化标准化的掌握也更加熟练了。
经历不进行总结就只是经历,只有总结了才会成为经验。项目不在于大小,贪多嚼不烂嘛,小项目也需要完全消化才会学到新的东西,掌握新的技能。
最后,希望2024能与大家共同成长,致敬每一个热爱钻研的技术er!
infoq原文:https://xie.infoq.cn/article/28243e572986702f563255e94