Package: smart-fruit
PurposeA Python machine learning library, for creating quick and easy machine learning models.
It is schema-based, and wrapsscikit-learn.UsageCreate and use a machine learning model in 3 steps:Create a schema representing your input and output features.Train a model from your data.Make predictions from your model.ExampleTo get a feel for the library, consider the classicIrisdataset,
where we predict the class of iris plant from measurements of the sepal, and petal.First, we create a schema describing our inputs and outputs.
For our inputs, we have the length, and width, of both the sepal, and the petal.
All of these input values happen to be numbers.
For our output, we have just the class of iris, which may be one of the labelsIris-setosa,Iris-versicolor, orIris-virginica.We define this in code as follows:fromsmart_fruitimportModelfromsmart_fruit.feature_typesimportNumber,LabelclassIris(Model):classInput:sepal_length_cm=Number()sepal_width_cm=Number()petal_length_cm=Number()petal_width_cm=Number()classOutput:iris_class=Label(['Iris-setosa','Iris-versicolor','Iris-virginica'])Then, we train a model:model=Iris.train(Iris.features_from_csv('iris_data.csv'))with data fileiris_data.csv.sepal_length_cm,sepal_width_cm,petal_length_cm,petal_width_cm,iris_class
5.1,3.5,1.4,0.2,Iris-setosa
...Finally, we use our new model to make predictions:forpredictioninmodel.predict([Iris.Input(5.1,3.5,1.4,0.2)]):print(prediction.iris_class)ReferenceModelsModel.Input- Schema for defining your input features.Model.Output- Schema for defining your output features.DefineModel.InputandModel.Outputas classes withFeatureTypeattributes.eg. Consider theIrisclass defined above.These classes can then be used to create objects representing the appropriate collections of features.eg.>>>iris_input=Iris.Input(5.1,3.5,1.4,0.2)>>>iris_inputInput(sepal_length_cm=5.1,sepal_width_cm=3.5,petal_length_cm=1.4,petal_width_cm=0.2)>>>iris_input.sepal_length5.1>>>Iris.Input.from_json({'sepal_length_cm':5.1,'sepal_width_cm':3.5,'petal_length_cm':1.4,'petal_width_cm':0.2})Input(sepal_length_cm=5.1,sepal_width_cm=3.5,petal_length_cm=1.4,petal_width_cm=0.2)Model.features_from_list(lists)- Deserialize an iterable of lists into an iterable of input/output feature pairs.eg.>>>list(Iris.features_from_list([[5.1,3.5,1.4,0.2,'Iris-setosa']]))[(Input(sepal_length_cm=5.1,sepal_width_cm=3.5,petal_length_cm=1.4,petal_width_cm=0.2),Output(iris_class='Iris-setosa'))]Model.input_features_from_list(lists)- Deserialize an iterable of lists into an iterable of input features.eg.>>>list(Iris.input_features_from_list([[5.1,3.5,1.4,0.2]]))[Input(sepal_length_cm=5.1,sepal_width_cm=3.5,petal_length_cm=1.4,petal_width_cm=0.2)]Model.features_from_json(json)- Deserialize an iterable of dictionaries into an iterable of input/output feature pairs.eg.>>>list(Iris.features_from_json([{'sepal_length_cm':5.1,'sepal_width_cm':3.5,'petal_length_cm':1.4,'petal_width_cm':0.2,'iris_class':'Iris-setosa'}]))[(Input(sepal_length_cm=5.1,sepal_width_cm=3.5,petal_length_cm=1.4,petal_width_cm=0.2),Output(iris_class='Iris-setosa'))]Model.input_features_from_json(json)- Deserialize an iterable of dictionaries into an iterable of input features.eg.>>>list(Iris.input_features_from_json([{'sepal_length_cm':5.1,'sepal_width_cm':3.5,'petal_length_cm':1.4,'petal_width_cm':0.2}]))[Input(sepal_length_cm=5.1,sepal_width_cm=3.5,petal_length_cm=1.4,petal_width_cm=0.2)]Model.features_from_csv(csv_path)- Take a path to a CSV file, or a file-like object, and deserialize it into an iterable of input/output feature pairs.If column headings are not given in the file, assume the input features are followed by the output features, in the order they are defined in their respective classes.eg.>>>list(Iris.features_from_csv('iris_data.csv'))[(Input(sepal_length_cm=5.1,sepal_width_cm=3.5,petal_length_cm=1.4,petal_width_cm=0.2),Output(iris_class='Iris-setosa')),...]Model.input_features_from_csv(csv_path)- Take a path to a CSV file, or a file-like object, and deserialize it into an iterable of input features.If column headings are not given in the file, assume they are in the order they are defined in theInputclass.eg.>>>list(Iris.input_features_from_csv('iris_data.csv'))[Input(sepal_length_cm=5.1,sepal_width_cm=3.5,petal_length_cm=1.4,petal_width_cm=0.2),...]Model.model_class- How to model the relation between the input and output data.Default:sklearn.linear_model.LinearRegressionThis attribute accepts any class withfit,predict, andscoremethods defined as forscikit-learnmulti-response regression models.
In particular, this attribute accepts anyscikit-learnmulti-response regression models,
ie. anyscikit-learnregression model where theyparameter offitaccepts a numpy array of shape[n_samples, n_targets].Model.train(features, train_test_split_ratio=None, test_sample_count=None, random_state=None)Train a new model on the given iterable of input/output pairs.Parameters:features- An iterable of input/output pairs.train_test_split_ratio- Proportion of data to use as cross-validation test data.test_sample_count- Number of samples of data to use as cross-validation test data.Iftrain_test_split_ratioortest_sample_countare provided, perform cross-validation of the given data.
Return both the trained model, and the score of the test data on that model.random_state- Either anumpyRandomState, or the seed to use for the PRNG.Useful for getting consistent results, for example for automated tests.
Do not use this parameter when generating models you plan to use in production settings.eg.>>>iris_model=Iris.train([(Iris.Input(5.1,3.5,1.4,0.2),Iris.Output('Iris-setosa'))])model.predict(input_features, yield_inputs=False)- Predict the outputs for a given iterable of inputs.Ifyield_inputsisTruethen yield the prediction with the input used to generate it, asinput,outputpairs.
Otherwise, yield just the predictions, in the same order the inputs are given to the model.eg.>>>list(iris_model.predict([Iris.Input(5.1,3.5,1.4,0.2)]))[Output(iris_class='Iris-setosa')]Feature TypesSmart Fruit recognizes the following data types for input and output features.
Custom types may be made by extending theFeatureTypeclass.Number()- A real-valued feature.eg.0,1,3.141592,-17, …Integer()- A whole number feature.eg.0,1,3,-17, …Complex()- A complex-valued number feature.eg.0,1,3 + 4j,-1+ 7j, …Label(labels)- An enumerated feature, ie. one which may take one of a pre-defined list of available values.eg. Forlabels = ['red', 'green', 'blue'], our label may take the value'red', but not'purple'.Vector(feature_types)- A feature made of other features. Useful for grouping conceptually related features.eg. Forfeature_types =[Number(),Label(['red','green','blue'])], we may take values such as(0, 'red'), and(1, 'blue').Tag()- A feature that is ignored when making predictions. Useful for keeping track of ID numbers.Accepts any Python value.RequirementsSmart Fruit requires Python 3.6+, and usesscikit-learn,scipy,
andpandas.InstallationInstall and update using the standard Python package managerpip:pip install smart-fruitDonateTo support the continued development of Smart Fruit, pleasedonate.