项目简介
利用机器学习对提供的数据集预测用户输入的密码是否为弱密码。
原始数据集只包含关于弱密码的信息,并没有包含强密码的数据或分类器,这意味着模型无法学习到强密码的规律!!!
我之所以这样设计这个示例,其目的是为了向你展示模型的工作原理。如果在数据集中添加一些强密码的样本和模式信息,那么机器学习算法就能完美运作,并准确预测你的密码是否足够strong.
当然,当你的密码与弱密码数据集差异性较大时,那么也可以视为有一定强度的密码。
实现步骤
- 从Kaggle数据集中加载密码及其对应强度的数据;
- 对原始数据进行预处理,移除包含缺失密码信息的行;
- 将数据集划分为训练集和测试集,以验证模型性能;
- 使用字符级别的TF-IDF方法将密码文本转换为数值特征向量,便于机器学习模型处理;
- 训练随机森林分类器以预测密码强度,其中设置有100棵树,并使用固定随机种子确保结果可复现;
- 在测试集上应用训练好的模型进行预测并计算准确率;
- 接收用户输入的密码,利用已训练好的模型预测其强度,并根据预测值判断密码是强还是弱。
最终,该程序在输出模型在测试集上的准确率后,可以实时接收用户输入的密码,为其提供强度评估反馈。
代码实现
import numpy as np # 引入numpy库,用于科学计算
import pandas as pd # 引入pandas库,用于数据处理# 机器学习相关的库
from sklearn.feature_extraction.text import TfidfVectorizer # 文本特征提取
from sklearn.model_selection import train_test_split # 数据集划分
from sklearn.ensemble import RandomForestClassifier # 随机森林分类器
from sklearn.impute import SimpleImputer # 缺失值填充
from sklearn.metrics import accuracy_score # 准确率计算# 遍历kaggle输入目录下的所有文件
import os
for dirname, _, filenames in os.walk('/kaggle/input'):for filename in filenames:print(os.path.join(dirname, filename))
读取密码数据集,并使用朴素贝叶斯模型来评估密码强度:
# 加载密码数据集
data = pd.read_csv("/kaggle/input/passwords/passwords.csv")# 移除包含缺失值的行
data = data.dropna(subset=["password"])# 准备特征和目标变量
X = data["password"]
y = data["strength"]# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 使用简单插值器处理缺失值
imputer = SimpleImputer(strategy="constant", fill_value="")
X_train = imputer.fit_transform(X_train.values.reshape(-1, 1)).ravel()
X_test = imputer.transform(X_test.values.reshape(-1, 1)).ravel()# 使用TF-IDF进行特征向量化
vectorizer = TfidfVectorizer(analyzer="char")
X_train_tfidf = vectorizer.fit_transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)# 训练随机森林分类器
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train_tfidf, y_train)# 在测试集上进行预测并计算准确率
predictions = model.predict(X_test_tfidf)
accuracy = accuracy_score(y_test, predictions)
print("Accuracy:", accuracy)# 接收用户输入并预测密码强度
password_to_check = input("Enter a password: ")
password_vector = vectorizer.transform([password_to_check])
prediction = model.predict(password_vector)[0]
print(prediction)
if prediction > 4 :print("Strong password.")
else:print("Weak password.")
步骤包括:
- 加载密码数据集;
- 清洗数据,去除包含缺失值的行;
- 将数据集划分为训练集和测试集;
- 使用字符级别的TF-IDF向量化密码文本;
- 训练随机森林分类器以评估密码强度;
- 对测试集进行预测并计算准确率;
- 接收用户输入的密码,并使用模型预测其强度。
不返回任何值,但会打印出密码强度的评估结果。
运行测试
优化方向
当然可以从以下方面尝试提高模型准确率:
- 数据增强:可以尝试生成更多的训练样本(例如通过密码的组合、变异规则等)来增加模型对各种复杂情况的学习能力。
- 特征工程:优化字符级别的TF-IDF向量化过程,比如考虑不同的n-gram范围,或者引入其他有助于区分密码强度的特征。
- 尝试更换其他类型的分类器,如SVM、XGBoost、LightGBM或深度学习模型,比较不同模型在该问题上的表现。
- 对当前使用的随机森林模型进行参数调优,使用GridSearchCV或RandomizedSearchCV搜索最佳的超参数组合,如树的数量(n_estimators)、最大深度(max_depth)、最小叶子节点样本数(min_samples_leaf)等。
- 集成学习:除了单一模型外,还可以尝试使用集成方法,例如结合多个模型的预测结果,进一步提升性能。
- 处理不平衡类别:如果训练集中强密码和弱密码的比例严重失衡,需要采取过采样、欠采样或其他平衡策略来处理类别不平衡问题。
- 评估指标:根据实际需求选择合适的评估指标,例如对于这种二分类问题,精确率、召回率以及F1值可能更有意义,而不是仅仅依赖于整体的准确率。
- 模型解释与错误分析:深入理解模型为何做出某些预测,并分析预测错误的样本,找出其中的规律和特点,据此改进模型或预处理步骤。